一、元组基础特性
- 定义:TypeScript 特有类型,允许数组成员类型不同(与数组的“同类型成员”特征区分)。
- 声明方式:成员类型写在方括号内,需显式声明(否则会被推断为联合类型数组)。
示例:const t: [string, number, boolean] = ['a', 1, true]
。 - 与数组的区分:
- 数组:类型写在方括号外(
number[]
),成员类型必须相同。 - 元组:类型写在方括号内(
[number]
),成员类型可不同。
二、元组成员规则
- 可选成员:尾部成员可加
?
表示可选(可选成员必须在必选成员之后)。
示例:type Tuple = [number, string?]
(可包含 1 或 2 个成员)。 - 不定成员:用扩展运算符(
...
)表示不限数量的成员,...
后需跟数组/元组。
示例:type NamedNums = [string, ...number[]]
(第一个成员为字符串,后续为任意数量数值)。
- 成员命名:可添加说明性名称(无实际作用),格式为
名称: 类型
。
示例:type Color = [red: number, green: number, blue: number]
。
三、只读元组
- 声明方式:
readonly [类型1, 类型2]
Readonly<[类型1, 类型2]>
(泛型工具类型)。
- 特性:禁止修改、新增、删除成员。
- 类型关系:普通元组是只读元组的子类型(普通元组可赋值给只读元组,反之不行)。
- 示例:
let t: [number] = [1]; let rt: readonly [number] = t
正确;t = rt
报错。
四、成员类型与数量推断
- 成员类型读取:
- 通过索引:
type Tuple = [string, number]; type T = Tuple[1]
(返回 number
)。 - 所有成员类型:
Tuple[number]
(返回联合类型,如 string|number
)。
- 成员数量推断:
- 无可选成员和
...
时,TypeScript 可确定元组长度(如 [number, number]
长度固定为 2)。 - 含可选成员时,推断可能的长度范围(如
[number, number?]
长度为 1|2
)。 - 含
...
时,无法推断长度,元组会被当作数组处理(成员数量不确定)。
五、扩展运算符应用
- 数组传参问题:数组用
...
传参时,因成员数量不确定可能报错(如函数需固定参数个数)。 - 解决方法:
- 将数组声明为固定长度元组:
const arr: [number, number] = [1, 2]
。 - 使用
as const
断言:const arr = [1, 2] as const
(推断为只读元组 readonly [1, 2]
)。