注意:如果您是TypeScript新手,请先查看我们的TypeScript入门指南。
在 TypeScript 中,元组是一种特殊的 数组,它允许你
- 存储固定数量的元素。
- 为每个元素指定特定的类型和顺序。
这是一个简单的元组示例。你可以阅读本教程的其余部分以了解更多信息。
示例
// Create a tuple with string and number data
let person: [string, number] = ["Alice", 25];
console.log(person);
// Output: [ 'Alice', 25 ]
在这里,person
是一个元组,它的第一个元素必须是字符串,第二个元素必须是数字。
如何定义和使用元组
声明元组
你可以通过按顺序列出其元素的类型来定义元组。例如,
let point: [number, number] = [10, 20];
在这里,point
必须始终包含两个数字。
访问元组值
就像数组一样,你可以使用索引号来获取值
console.log(point[0]); // 10
console.log(point[1]); // 20
为什么要使用元组?
当你想要将几个属于一起但类型不同的值组合起来时,元组非常有用。它们非常适合诸如
- 坐标:例如,
[10, 20]
,其中两个值都是数字(x 和 y 坐标)。 - 产品项:例如,
["Apple", 1.99, true]
,其中元素代表产品名称(字符串)、价格(数字)和可用性(布尔值)。
示例 1:TypeScript 元组
// Create a tuple with string and number data
let person: [string, number] = ["Alice", 25];
// Access the first element
console.log(person[0]);
// Access the second element
console.log(person[1]);
输出
Alice 25
在此示例中,person
是一个 [string, number]
类型的元组。在这里,
person[0]
- 获取元组的第一个元素,即字符串"Alice"
。person[1]
- 获取元组的第二个元素,即数字 25。
注意:你不能交换元组中元素的顺序。例如,在 [string, number]
类型的元组中,第一个元素不能是数字类型,第二个元素也不能是字符串类型。
示例 2:更改元组元素
你也可以使用数组表示法来更改元组元素。或者,你可以为元组分配新值。例如,
// Create a tuple with string and number data
let person: [string, number] = ["Alice", 25];
// Print the tuple
console.log(person);
// Change the first element
person[0] = "Veronica";
// Print the changed tuple
console.log(person);
// Assign new values to the entire tuple
person = ["Brad", 39];
// Print the changed tuple
console.log(person);
输出
[ 'Alice', 25 ] [ 'Veronica', 25 ] [ 'Brad', 39 ]
元组中的可选元素
有时,元组中的所有值并非都必需。你可以使用 ?
符号将元素标记为可选。
let logEntry: [string, number?] = ["Error"];
console.log(logEntry);
// Output: [ 'Error' ]
在这种情况下,第二个项(数字)是可选的。因此,不必初始化该项。
注意:可选元组元素必须放在最后。例如,不允许使用 [number?, string]
,因为它将必需元素放在了可选元素之后。
当然,如果你愿意,也可以为可选元素赋值
let logEntry: [string, number?] = ["Error", 404];
console.log(logEntry);
// Output: [ 'Error', 404 ]
不用说,如果你包含可选元素,TypeScript 仍然会检查类型
// Invalid code: Type 'string' is not assignable to type 'number'
let logEntry: [string, number?] = ["Error", "oops"];
更多关于 TypeScript 元组
在 JavaScript 中,没有元组。因此,当 TypeScript 代码编译成 JavaScript 代码时,元组会被转换为数组。
JavaScript 数组非常灵活——它们可以按任何顺序包含任何类型的任何值
// This is just a regular array in JS
let jsArray = ["Alice", 25];
在 TypeScript 中,元组允许你定义元素的类型和顺序
let tsTuple: [string, number] = ["Alice", 25];
如果你尝试更改顺序或使用错误的类型,TypeScript 会给你一个错误。
元组具有固定的类型和顺序,但仍然可以在运行时使用 push()
等数组方法进行修改
let user: [string, number] = ["Tom", 42];
// No error, but now it's no longer what we expected
user.push(100);
console.log(user); // ["Tom", 42, 100]
这是 TypeScript 的一个限制——它不会在编译时捕获此问题。
为防止这种情况,你需要将元组标记为 readonly
let safeUser: readonly [string, number] = ["Tom", 42];
//Error: Cannot modify a readonly tuple
safeUser.push(100);
由于元组会被编译成 JavaScript 数组,因此允许使用 push()
等方法,除非元组被标记为 readonly
。除非使用 readonly
强制执行,否则 TypeScript 不会捕获此问题。
TypeScript 确保元组中的每个值都具有正确的类型和位置,从而帮助你及早发现错误。例如,
let data: [string, boolean] = ["Test", true];
// Valid code
data[1] = false;
// Error: expected a boolean instead of string
data[1] = "oops";
这种类型检查功能可确保你的数据保持可预测性,并减少因在错误位置使用错误类型而导致的 bug。
另请阅读