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

为何TypeScript中直接判断联合类型与泛型Exclude结果不同?

泛版MyExclude与直接条件判断的结果差异原因

先看你给出的类型定义:

type A = 'a' | 'b'
type B = 'a'

泛型实现的MyExclude为何正确?

当调用MyExclude<A, B>时,TypeScript会触发分布式条件类型特性:

  • 联合类型A会被拆分为单个成员:'a'和'b'
  • 对每个成员分别执行条件判断:
    • 'a' extends 'a' ? never : 'a' → 结果为never
    • 'b' extends 'a' ? never : 'b' → 结果为'b'
  • 最后将结果合并为联合类型:never | 'b',而never是联合类型的吸收元,会被自动忽略,最终得到'b'

直接条件判断为何不符合预期?

直接写type C = A extends B ? never : A时,不会触发分布式条件类型:

  • 这里是把整个联合类型'a' | 'b'作为一个整体,判断它是否extends'a'。显然'a' | 'b'并不完全是'a'的子集,条件判断结果为false,因此直接返回原联合类型A,也就是'a' | 'b'

核心差异:分布式条件类型的触发条件

只有当条件类型的**泛型参数是裸类型(未被数组、元组、对象等结构包裹)**时,TypeScript才会对联合类型的成员逐一进行判断。直接使用联合类型做条件判断时,没有泛型参数参与,不会拆分联合类型,而是整体进行逻辑判断。

内容的提问来源于stack exchange,提问作者Earl Hickey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:20:26