TypeScript 元组(Tuple)类型详解
元组是定长、定位类型的数组:[string, number] 第一位必是字符串。本文讲解元组基础、可选与剩余元素、标签语法与实战场景。
元组声明固定位置的类型序列:type Point = [number, number]。长度越界访问、位置类型错误编译期拦截。适用:坐标、键值对、多返回值(useState 的 [value, setter] 就是元组)。
定长定位的价值
// 普通数组:元素类型混杂无约束
const row: (string | number)[] = ['张三', 28];
row[0].toFixed(); // 编译器无法确定 row[0] 是 string——不安全
// 元组:位置有类型
const user: [string, number] = ['张三', 28];
user[0].toUpperCase(); // ✓ string
user[1].toFixed(2); // ✓ number
user[2]; // ✗ 越界编译错误
可选与剩余元素
// 可选元素
type Csv = [string, string, number?];
// 剩余元素:前两项定位,后面任意
type LogEntry = [level: 'info' | 'error', message: string, ...meta: unknown[]];
标签元组
// 标签提升可读性(纯文档作用,类型不变)
type Point = [x: number, y: number];
function distance(...[x1, y1, x2, y2]: [...a: Point, ...b: Point]) {...}
IDE 悬浮提示显示标签名——useState 的 [state, setState] 体验即来源于此。
实战场景
- React hooks 返回值:
[value, setter]元组保证解构顺序无关的正确性; - Map 迭代:
for (const [key, value] of map)——键值对即元组; - CSV/数据库行:列位置语义固定;
- Promise.all:
Promise.all([a, b])的返回是元组——各位置类型分别保留。
常见问题(FAQ)
Q:元组和对象怎么选?
语义"位置有意义"(坐标、键值对)用元组;"名字有意义"(配置、实体)用对象。解构简短选元组,字段多了选对象。
Q:as const 数组是元组吗?
[1, 'a'] as const 推导为 readonly [1, 'a']——只读元组 + 字面量类型,类型编程的常用原料。
Q:readonly 元组?
readonly [number, number]——防修改的元组,函数返回值常用的防御性写法。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。