为何TypeScript中直接判断联合类型与泛型Exclude结果不同?
泛版MyExclude与直接条件判断的结果差异原因
先看你给出的类型定义:
type A = 'a' | 'b' type B = 'a'
泛型实现的MyExclude为何正确?
当调用MyExclude<A, B>时,TypeScript会触发分布式条件类型特性:
- 联合类型
A会被拆分为单个成员:'a'和'b' - 对每个成员分别执行条件判断:
'a' extends 'a' ? never : 'a'→ 结果为never'b' extends 'a' ? never : 'b'→ 结果为'b'
- 最后将结果合并为联合类型:
never | 'b',而never是联合类型的吸收元,会被自动忽略,最终得到'b'
直接条件判断为何不符合预期?
直接写type C = A extends B ? never : A时,不会触发分布式条件类型:
- 这里是把整个联合类型
'a' | 'b'作为一个整体,判断它是否extends'a'。显然'a' | 'b'并不完全是'a'的子集,条件判断结果为false,因此直接返回原联合类型A,也就是'a' | 'b'
核心差异:分布式条件类型的触发条件
只有当条件类型的**泛型参数是裸类型(未被数组、元组、对象等结构包裹)**时,TypeScript才会对联合类型的成员逐一进行判断。直接使用联合类型做条件判断时,没有泛型参数参与,不会拆分联合类型,而是整体进行逻辑判断。
内容的提问来源于stack exchange,提问作者Earl Hickey
相关产品推荐
相关产品推荐

