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]——防修改的元组,函数返回值常用的防御性写法。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台