Type-challenges类型体操 1097-IsUnion 题解

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。

经验分享 程序员 微信小程序 职场和发展