Typescript中是否有方法可直接从联合类型中排除指定类型?
TypeScript 联合类型排除指定类型的解决方案
TypeScript 官方已经内置了专门用于从联合类型中剔除指定类型的工具类型 Exclude<T, U>,完全可以直接满足你的需求,不需要额外实现运行时代码。
基础用法
直接传入原始联合类型和要排除的类型即可:
type T = number | string | VoidFunction; // 原始联合类型 type R = Exclude<T, VoidFunction>; // 推导结果为 number | string
实现原理(可选自定义)
如果你需要自己实现同名的工具类型,也可以基于分布式条件类型实现,逻辑非常简单:
type ExcludeType<T, U> = T extends U ? never : T;
原理说明:当泛型 T 为联合类型时,条件类型会自动遍历联合的每个子类型,若子类型可赋值给 U 则返回 never(相当于在联合类型中移除该分支),否则保留原类型,最终将所有保留的子类型组合为新的联合类型。
方案优势
- 纯类型层面实现,无任何运行时代码,完全支持在
.d.ts声明文件中使用 - 扩展性极强,支持任意联合类型和排除类型的组合,不需要针对场景修改逻辑
- 属于 TypeScript 官方标准内置工具类型,全版本兼容性有保障,无需额外维护
现有方案补充说明
你当前通过运行时函数的实现存在偏差:typeof f 得到的是函数本身的类型 (v: T) => number | string | undefined,而非你预期的返回值类型。如果要基于运行时方案实现,正确写法需要搭配 ReturnType 工具类型,还要额外排除返回的 undefined 类型:
type R = Exclude<ReturnType<typeof f>, undefined>; // 才能得到 number | string
对比下来直接使用内置 Exclude 是成本最低、可靠性最高的方案。
内容的提问来源于stack exchange,提问作者8pattern
相关产品推荐
相关产品推荐

