TypeScript如何从联合类型中移除null并实现通用泛型工具?
你要的能力TypeScript已经提供了原生支持,也可以自己手动实现通用泛型,具体方案如下:
1. 直接使用内置工具类型
TypeScript 内置的Exclude泛型就是专门用来从联合类型中剔除指定成员的,针对你的第一个场景可以直接使用:
type Foo = string | null // 剔除null后得到类型 string type NonNullFoo = Exclude<Foo, null>
对应的函数写法和你给出的示例完全契合:
function returnSomething(input: Foo): Exclude<Foo, null> { if (input === null) throw new Error('No.'); return input; }
2. 封装通用的剔除null泛型
如果要适配任意联合类型移除null的需求,只要基于Exclude做一层简单封装即可:
// 通用泛型:传入任意联合类型T,返回剔除了null的新类型 type RemoveNullFromUnion<T> = Exclude<T, null>
你要的通用版函数就可以写成:
function returnSomething<T>(input: T): RemoveNullFromUnion<T> { if (input === null) throw new Error('No.'); return input; }
如果需要同时剔除null和undefined,可以直接使用TypeScript另一个内置工具NonNullable<T>,无需额外封装。
3. 手动实现通用剔除逻辑(原理说明)
如果你想自己实现你示例中提到的RemoveFromUnion泛型,不需要依赖内置工具,可以基于条件类型的分布式特性实现:
type RemoveFromUnion<T, U> = T extends U ? never : T
这个实现的逻辑是:当T为联合类型时,会遍历每一个成员判断是否属于要剔除的类型U,匹配的成员会返回never(自动从联合类型中消失),不匹配的成员保留,最终得到剔除了U的新联合类型。
内容的提问来源于stack exchange,提问作者Evert
相关产品推荐
相关产品推荐

