You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建将联合类型整体判断的TypeScript条件类型?

实现NonNullable2类型

TypeScript内置的NonNullable<T>是分布式条件类型,会逐个处理联合类型的成员,因此传入string | null时会过滤掉null成员,最终返回string。但我们需要实现的NonNullable2要求:如果传入的类型T允许被null赋值(即null是T的子类型),则返回never;否则返回原类型T,对应示例中NonNullable2<string | null>返回never,NonNullable2<string>返回string。

实现代码

type NonNullable2<T> = null extends T ? never : T;

// 测试验证
type Test1 = NonNullable2<string>; // string(null不能赋值给string,返回原类型)
type Test2 = NonNullable2<string | null>; // never(null可以赋值给string|null,返回never)
type Test3 = NonNullable2<null>; // never(null是自身的子类型,返回never)
type Test4 = NonNullable2<number | undefined>; // number | undefined(null不能赋值给该类型,返回原类型)

原理说明

这里利用TypeScript的条件类型判断逻辑:null extends T用于检查null是否是T的子类型(即T是否允许接收null值)。和内置NonNullable的分布式处理不同,这个判断不会拆分联合类型,而是将整个T作为一个整体进行检查:

  • 当T包含null(比如string | null)或者T本身就是null时,null extends T为真,返回never;
  • 当T不允许接收null值时,判断为假,返回原类型T。

如果严格按照你描述的“T可赋值为null”(即T是null的子类型),那只有T为null或never时才会返回never,但这和你给出的Test2示例结果不符,因此上述实现是基于示例需求调整后的正确方案。

内容的提问来源于stack exchange,提问作者mnj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:50:36