IsUnion
题解:
type IsUnion<T extends any, O = T> = T extends O ? [O] extends [T] ? false : true : never
有同学就会问了,为什么这样阿?[T]
和 [O]
有什么区别阿?
让我来解密一下原理。
本题利用分布条件类型,extends会应用于联合类型的每个成员
什么是分布条件类型?
- 被检查类型(即上述的T)是裸类型参数的条件类型称分布条件类型。
- 在实例化期间,分布条件类型会自动分布在联合类型上,即条件类型应用于联合类型的每个成员,结果是所有结果的联合。
什么是裸类型参数?
类型参数没有被包装到另一种类型中,例如:数组、元组、函数、或任意其他泛型类型。
原理分析
例子1:IsUnion<string|number>
1、先解释 T extends O ?
我们以为:string | number extends string | number
实际上是:(string extends string | number) | (number extends string |number)?
即:T有两种类型:string
、number
2、此时[T] 为 :[string] | [number]
,而[O]为extends后面的东西,没有被分布条件类型分布,所以此时[O]为:[ string|number ]
3、比较[O] extends [T],在该情况下 extends 不成立,返回true。
我们再看看 只传单个类型的情况
例子2:isUnion<string>
利用分布条件类型,T也只有一种类型,此时[T]为[string]
,[O]为[string]
,该情况下extends成立,返回false。