You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法理解分布式条件类型结果:为何(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是否extends 1?

显然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:25:21