挑战
Implement a type IsUnion, which takes an input type T and returns whether T resolves to a union type.
For example:
type case1 = IsUnion<string>; // false
type case2 = IsUnion<string | number>; // true
type case3 = IsUnion<[string | number]>; // false解答
type IsUnion<T, K = T> = [T] extends [never]
? false
: K extends T // 肯定成立
? [T] extends [K] // 说明只有一个元素
? false
: true
: false;我们首先判断 T 是否是 never 类型,如果是,则返回 false。
然后我们定义一个辅助类型 K,默认为 T。接着我们判断 K 是否是 T 的子类型,如果是,则说明 T 是联合类型。最后我们判断 T 是否只有一个元素,如果是,则返回 false,否则返回 true。