进行 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