TypeScript 元组

注意:如果您是TypeScript新手,请先查看我们的TypeScript入门指南


在 TypeScript 中,元组是一种特殊的 数组,它允许你

  1. 存储固定数量的元素。
  2. 为每个元素指定特定的类型和顺序。

这是一个简单的元组示例。你可以阅读本教程的其余部分以了解更多信息。

示例

// 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 元组

TypeScript 元组与 JavaScript 数组

在 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。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战