在上一章中对对象做了一番了解之后,让我们一起来看看类型级 TypeScript 中第二重要的数据类型 —— 元组

这可能会让人感到惊讶,但是元组在类型级别上比起数组可有趣得多。实际上,它们类型级编程中真正的数组。在本章中,我们将学习为什么它们如此有用,以及如何使用它们所有非常棒的特性。我们开始吧!

元组

元组类型定义具有固定长度的数组集合,每个索引可以包含不同类型的值。例如,元组 [string, number] 定义了包含正好是两个值的数组集合,其中第一个值是字符串,第二个值是数字。

tuple-set.e42d9666.svg

元组本质上是类型列表!它们可以包含零个、一个或多个项,每个项可以是完全不同的类型。与联合类型不同,元组中的类型是有序的,并且可以存在多次。它们看起来就像 JavaScript 数组,是它们的类型级别等价物:

type Empty = [];
type One = [1];
type Two = [1, "2"]; // types can be different!
type Three = [1, "2", 1]; // tuples can contain duplicates

读取元组的索引

就像使用 JS 数组一样,您可以通过使用数字索引来访问元组中的值:

type SomeTuple = ["Bob", 28];

type Name = SomeTuple[0]; // "Bob"
type Age = SomeTuple[1]; // 28

唯一的区别是元组是由数字字面量类型而不仅仅是数字索引的。

读取多个索引

我们已经在 对象 & 记录 中看到,可以使用字符串字面量的并集同时从对象中读取几个键:

type User = { name: string; age: number; isAdmin: true };

type NameOrAge = User["name" | "age"]; // => string | number

我们可以通过使用数字字面量类型的并集来对元组做同样的事情!

type SomeTuple = ["Bob", 28, true];

type NameOrAge = SomeTuple[0 | 1]; // => "Bob" | 28

我们可以用 T[number] 同时读取元组 T 中的所有索引:

type SomeTuple = ["Bob", 28, true];

type Values = SomeTuple[number]; // "Bob" | 28 | true