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

TypeScript中[number|string]为何不extends [number]|[string]?相关疑问

TypeScript条件类型中元组的处理逻辑解析

先看测试用例:

// 结果均为true
type A = [boolean | string] extends [boolean] | [string] ? true : false // true
type B = [number | boolean] extends [number] | [boolean] ? true : false // true
type C = [1 | string] extends [1] | [string] ? true : false // true

// 结果为false
type D = [number | string] extends [number] | [string] ? true : false // false

问题1:TypeScript编译器在条件类型中如何处理元组类型?是否会将单个元组拆分为多个元组?

TypeScript在条件类型中处理元组时,核心逻辑如下:

  • 元组被视为固定长度的特殊数组类型,extends判断本质是检查左侧元组是否可分配给右侧类型。
  • 当元组的元素类型是单例类型的联合(比如boolean,即true | false;或字面量联合如1 | 2),或包含单例类型的联合时,编译器会隐式将该元组拆解为多个单元素元组的联合。比如[boolean | string]会被拆解为[true] | [false] | [string]。
  • 当元组的元素类型是两个非单例基础类型的联合(比如number | string),编译器不会拆解,而是将其作为单一元组类型处理,元素类型为该联合类型。

问题2:为何类型D的判断结果为false?

类型D返回false的原因可拆解为两点:

  1. [number | string]是单一元组类型,元素类型为number | string(两个非单例基础类型的联合),编译器不会将其拆解为[number] | [string]。
  2. 根据TypeScript的可分配性规则,类型X可分配给联合类型Y1 | Y2的前提是:X可分配给Y1 或 X可分配给Y2。而[number | string]既不能分配给[number](number | string无法分配给number,string不是number的子类型),也不能分配给[string](同理,number不是string的子类型),因此条件判断返回false。

对比A、B、C返回true的原因:

  • A中boolean是true | false的单例联合,[boolean | string]拆解后与[boolean] | [string]等价。
  • B中boolean是单例联合,[number | boolean]拆解后与[number] | [boolean]等价。
  • C中1是单例字面量类型,[1 | string]拆解后与[1] | [string]完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:37:02