TypeScript 中的元组(Tuple)是一种特殊的数组类型,它允许你表示一个已知元素数量和类型的数组,各元素的类型不必相同。以下是元组的主要使用场景和示例:
01. 函数返回多个值
当函数需要返回多个相关值时,使用元组比返回对象更简洁:
// 返回最小值和最大值
function minMax(arr: number[]): [number, number] {
return [Math.min(...arr), Math.max(...arr)];
}
const [min, max] = minMax([1, 5, 2, 8, 3]);
console.log(min, max); // 1, 802. React Hooks 的 useState
React 的 useStateHook 返回一个元组:
const [count, setCount] = useState<number>(0);
// 类型为: [number, React.Dispatch<React.SetStateAction<number>>]03. 键值对数据
表示简单的键值对关系:
type KeyValue = [string, any];
const config: KeyValue[] = [
["apiUrl", "https://api.example.com"],
["timeout", 5000],
["retries", 3]
];04. CSV 数据解析
处理表格数据或 CSV 格式数据:
type StudentRecord = [string, number, string]; // [姓名, 年龄, 班级]
const students: StudentRecord[] = [
["张三", 20, "计算机1班"],
["李四", 19, "计算机2班"],
["王五", 21, "计算机1班"]
];05. 坐标和几何数据
表示二维/三维坐标:
type Point2D = [number, number];
type Point3D = [number, number, number];
const point: Point2D = [10, 20];
const cube: Point3D = [10, 20, 30];06. 状态码和消息
HTTP 响应或错误处理:
type ApiResponse = [number, string, any?];
const responses: ApiResponse[] = [
[200, "成功", { data: [] }],
[404, "未找到"],
[500, "服务器错误"]
];07. 配置选项
多个相关的配置参数:
type DatabaseConfig = [string, number, string, string];
const dbConfig: DatabaseConfig = [
"localhost",
5432,
"mydb",
"password123"
];08. 解构赋值
与解构赋值配合使用:
// 交换变量值
let a = 1, b = 2;
[a, b] = [b, a];
// 从对象中提取多个值
const user = { name: "John", age: 30, city: "New York" };
const { name, age } = user;
const userTuple: [string, number] = [name, age];09. 可选元素和剩余元素
TypeScript 4.0+ 支持更灵活的元组语法:
// 可选元素
type OptionalTuple = [string, number?];
const t1: OptionalTuple = ["hello"];
const t2: OptionalTuple = ["hello", 42];
// 带剩余元素的元组
type StringNumberBooleans = [string, number, ...boolean[]];
const snb: StringNumberBooleans = ["hello", 1, true, false, true];
// 带标签的元组(增强可读性)
type HttpResponse = [status: number, data: any, message?: string];10. 与枚举结合使用
定义状态映射:
enum Status {
Success,
Error,
Loading
}
type StatusConfig = [Status, string, string];
const statusMap: StatusConfig[] = [
[Status.Success, "成功", "green"],
[Status.Error, "错误", "red"],
[Status.Loading, "加载中", "blue"]
];11.使用建议
适合使用元组的场景:
元素数量固定且类型已知
元素顺序有特定含义
需要解构赋值
临时性的数据结构
不适合使用元组的场景:
元素数量不确定时(使用数组)
需要具名字段时(使用接口或类型别名)
数据结构复杂时(使用对象或类)
元组提供了类型安全的同时保持了数组的简洁性,是 TypeScript 类型系统中非常实用的特性。