进行 extends
判断时,当左侧的类型参数为联合类型时,它们会具有分布式性。如:
type ToArray<Type> = Type extends any ? Type[] : never
type StrArrOrNumArr = ToArray<string | number>
通常,分布性是期望的行为。如果需要避免这种行为,可以用方括号将 extends
关键字的两侧括起来:
type ToArrayNonDist<Type> = [Type] extends [any] ? Type[] : never
boolean
boolean
是 true | false
联合类型,所以:
never
never
表示决不可能,当 extends
判断的左侧为 never
时,会被忽略:
所以这样判断是否是 never
的方法是错误的:
type IsNever<T> = T extends never ? true : false // 错误的
应该避免分布式性,改成:
type IsNever<T> = [T] extends [never] ? true : false // 正确的
遍历一个联合类型
// 构造一个泛型类型作为中间映射函数(因为分布式条件类型只有在泛型 + 条件判断时才生效)
type ForEach<T> = T extends T ? [T] : never
// 实验:
type A = 1 | 2 | 3
type B = ForEach<A> // [1] | [2] | [3]
遍历时保留原始联合类型
type IsUnion<T, Duplicate = T> = T extends T // 触发分布式性
? [Duplicate] extends [T] ? false : true // T 是每一项,Duplicate 是原始联合类型
: never