一、元组基础特性
- 定义: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])。
- 将数组声明为固定长度元组: