Tuples
通常来说,一个数组包含某个类型的一个或多个对象。TypeScript 针对包含
多个类型的数组有特殊的分析,并且在数组中索引的位置非常重要。
这被称为元组(Tuples),可以将他们视为连接数据的一种
方式,但是语法上来说比有键的对象简单。
你可以像创建 JavaScript 的数组一样创建一个元组。
// 如果你将鼠标悬停在两个变量的名称上,你可以看到
数组((string | number)[])和元组 ([string, number])之间的不同。
对于数组来说,顺序不重要,所以任何索引上的子项都可以是 string 或 number。
在元组中,顺序和长度将会得到报障。
const failingResponse = ["Not Found", 404];
// 但是你需要声明它的类型是一个元组。
const passingResponse: [string, number] = ["{}", 200];
// 这意味着 TypeScript 将在索引的位置提供正确的类型。如果您
尝试在未声明的索引处访问对象将会引发错误。
if (passingResponse[1] === 200) {
const localInfo = JSON.parse(passingResponse[0]);
console.log(localInfo);
}
// 如果元组的开头有一组已知的类型,然后跟着未知长度,可以使用 spread 运算符
来表示它可以具有任何长度,并且额外的索引将会具有指定的类型。
passingResponse[2];
// 对于较短的数据组合,元组看起来是一个不错的模式。
type StaffAccount = [number, string, string, string?];
const staff: StaffAccount[] = [
[0, "Adankwo", "adankwo.e@"],
[1, "Kanokwan", "kanokwan.s@"],
[2, "Aneurin", "aneurin.s@", "Supervisor"],
];
//
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#tuples-in-rest-parameters-and-spread-expressions
https://auth0.com/blog/typescript-3-exploring-tuples-the-unknown-type/
type PayStubs = [StaffAccount, ...number[]];
const payStubs: PayStubs[] = [
[staff[0], 250],
[staff[1], 250, 260],
[staff[0], 300, 300, 300],
];
const monthOnePayments = payStubs[0][1] + payStubs[1][1] + payStubs[2][1];
const monthTwoPayments = payStubs[1][2] + payStubs[2][2];
const monthThreePayments = payStubs[2][2];
// 您可以使用元组来描述带有未知长度参数的函数:
declare function calculatePayForEmployee(id: number, ...args: [...number[]]): number;
calculatePayForEmployee(staff[0][0], payStubs[0][1]);
calculatePayForEmployee(staff[1][0], payStubs[1][1], payStubs[1][2]);