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

TypeScript中extends关键字在泛型/非泛型场景下结果不同的原因

TypeScript 泛型联合类型的分布式条件类型特性

这是TypeScript的特性而非Bug,官方称之为分布式条件类型,是设计时就确定的预期行为。

核心差异原因

  • 泛型场景(C、C2):触发分布式拆分
    当条件类型的extends左侧是泛型类型参数,且传入该参数的是联合类型时,TypeScript会自动将联合类型拆分为单个成员,分别执行条件判断,最终将所有结果合并为新的联合类型。
    以Check<'a' | 'b', 'a'>为例,实际执行逻辑是:

    • 'a' extends 'a' ? 1 : 0 → 返回1
    • 'b' extends 'a' ? 1 : 0 → 返回0
      最终结果为1 | 0,Check2<'a' | 'b'>遵循完全相同的逻辑。
  • 非泛型场景(C3):无分布式行为
    当extends左侧是具体的联合类型(而非泛型参数)时,TypeScript会直接判断整个联合类型是否是右侧类型的子类型。由于'a' | 'b'并不完全属于'a'的子类型,因此结果为0。

禁用分布式行为的方法

如果需要在泛型场景中避免分布式拆分,可以将extends左侧的泛型参数包裹在元组中,阻止TypeScript拆分联合类型:

type CheckNoDistribute<T, U> = [T] extends [U] ? 1 : 0;
type C4 = CheckNoDistribute<'a' | 'b', 'a'> // 结果为 0

内容的提问来源于stack exchange,提问作者Eugene Karataev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:03:16