如何创建将联合类型整体判断的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
相关产品推荐
相关产品推荐

