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

TypeScript条件类型:TestType与T2的差异及结果不同原因探究

问题解答

1. 定义的TestType是否为条件类型?

是,type TestType<T> = T extends string ? 1: 2完全符合TypeScript条件类型的语法结构T extends U ? X : Y,属于泛型条件类型。

2. TestType<string | number>(等价于T1)与T2的核心差异

核心差异在于是否触发条件类型的分布式特性:

分布式特性的触发规则

当条件类型的泛型参数是联合类型,且该参数直接作为extends的左操作数时,TypeScript会自动将联合类型拆分为单个成员,分别执行条件判断,最后把结果重新合并为联合类型——这就是条件类型的分布式特性。

具体场景分析

  • TestType<string | number> 和 T1:
    TestType<T>的泛型T是联合类型string | number,且直接作为extends的左操作数,因此触发分布式特性:

    • 单独判断string extends string ? 1 : 2,得到结果1
    • 单独判断number extends string ? 1 : 2,得到结果2
    • 最终将两个结果合并为1 | 2,和T1手动拆分联合类型的逻辑完全一致。
  • T2:
    (string | number) extends string ? 1 : 2中,extends的左操作数是直接写死的联合类型,而非泛型参数,因此不会触发分布式特性。此时TypeScript会判断整个联合类型是否能赋值给右操作数string:由于number无法赋值给string,整个联合类型string | number不满足extends string的条件,最终结果为2。

一句话总结

  • 泛型条件类型遇到联合类型参数时,会「拆成单个成员判断后合并结果」(分布式)
  • 直接写死的联合类型做条件判断时,会「整体判断是否满足条件」(非分布式)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:45:30