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
相关产品推荐
相关产品推荐

