You need to enable JavaScript to run this app. TypeScript如何从联合类型中移除null并实现通用泛型工具?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 18:36:08