TypeScript嵌套元组展开分配性疑问:两种写法为何结果不同?
TypeScript元组扩展中的联合类型行为差异
先看两个不同写法的类型定义结果:
案例1:元组联合的展开
type Test = [...[1]|[3], 2] // ^? type Test = [1, 2] | [3, 2]
案例2:含联合元素的元组展开
type Test = [...[1|3], 2] // ^? type Test = [1 | 3, 2]
原理解释
- 案例1中,
[1]|[3]是两个元组组成的联合类型。当使用扩展运算符...展开这个联合时,TypeScript会触发联合类型的分布式处理:对联合中的每个元组成员单独执行扩展操作,再将结果合并为新的联合。也就是分别展开[1]得到[1,2]、展开[3]得到[3,2],最终结果是这两个元组的联合。 - 案例2中,
[1|3]是单个元组,其唯一元素是联合类型1|3。扩展这个元组时,只是将元组内的元素直接嵌入新元组的对应位置,不会触发分布式处理,因此最终得到的是包含联合元素的单个元组。
官方文档说明
这个分布式展开行为属于TypeScript类型系统对联合类型的标准处理逻辑,在官方文档的「元组类型」章节中,关于扩展运算符在元组中的使用部分,明确提到了如果扩展的是元组的联合类型,会对每个元组成员分别进行扩展并生成新的联合类型。
内容的提问来源于stack exchange,提问作者stratis
相关产品推荐
相关产品推荐

