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

IsUnion

image-20211020105642547
题解:

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有两种类型:stringnumber

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。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值