问题 #
实现一个类型 IsUnion
,它接受输入类型 T
并返回 T
是否解析为联合类型。
type case1 = IsUnion<string> // false
type case1 = IsUnion<string|number> // true
type case1 = IsUnion<'a'|'b'|'c'|'d'> // true
type case1 = IsUnion<undefined|null|void|''> // true
type case1 = IsUnion<{a: string}|{a: number}> // true
type case1 = IsUnion<{a: string|number}> // false
type case1 = IsUnion<[string|number]> // false
// Cases where T resolves to a non-union type.
type case1 = IsUnion<string|never> // false
type case1 = IsUnion<string|unknown> // false
type case1 = IsUnion<string|any> // false
type case1 = IsUnion<string|'a'> // false
解答 #
type IsUnion<T, U = T> = T extends U ? [U] extends [T] ? false: true : never
拆分 #
- 利用联合类型会自动分配的特性将联合类型拆开然后再集合判断
string|number
联合类型自动分配之后[string] extends [string]|[string] extends [string]|[number] extends [number]|[number] extends [string]
- 如果不是联合类型
[string] extends[string]
则永远都是则永远为
true`