无法理解分布式条件类型结果:为何(1 | 1 | 2) extends 1返回4而非3|4?
为什么
(1 | 1 | 2) extends 1 ? 3 : 4的结果是4? 这是因为你的代码没有触发TypeScript的分布式条件类型,具体原因如下:
分布式条件类型的触发前提
只有当条件类型的extends左侧是裸类型参数(即没有被数组、元组、对象等包裹的泛型参数)时,TypeScript才会对联合类型进行分布式展开——把联合类型的每个成员单独拿出来做条件判断,最后把结果合并成新的联合类型。
你的代码为什么不触发分布式
你写的(1 | 1 | 2) extends 1 ? 3 : 4中,extends左侧是一个具体的联合类型,不是裸类型参数,所以TypeScript会把整个1 | 1 | 2(等价于1 | 2)作为一个整体判断:
联合类型
1 | 2是否extends1?
显然2不属于1的类型范围,整个条件不成立,最终结果是4。
如何得到你预期的3 | 4
如果想要让联合类型的每个成员分别参与条件判断,需要用泛型定义一个接收裸类型参数的条件类型:
type Distrib<T> = T extends 1 ? 3 : 4; type Result = Distrib<1 | 1 | 2>; // 结果为 3 | 4
这里T是裸类型参数,TypeScript会自动把1 | 1 | 2拆分成1、1、2三个成员分别处理,得到3 | 3 | 4,最终简化为3 | 4,这才是你原本预期的逻辑。
内容的提问来源于stack exchange,提问作者user20550822
相关产品推荐
相关产品推荐

