Skip to content

数组类型(array)

在 TypeScript 中,数组类型用于表示一组相同类型的值的集合。TypeScript 提供了多种方式来定义和操作数组类型,确保类型安全性和代码的可读性。

定义数组类型

使用后缀 [] 语法

这是最常见的方式来定义一个数组类型:

typescript
let list: number[] = [1, 2, 3];

这里的 number[] 表示 list 是一个只包含数字的数组。

使用泛型数组类型 Array<元素类型>

另一种定义数组的方式是使用内置的 Array 泛型:

typescript
let list: Array<number> = [1, 2, 3];

这两种方法是等价的,选择哪一种主要取决于个人或团队的编码风格偏好。

多类型数组

如果你需要一个可以包含多种类型的数组,可以使用联合类型:

typescript
let list: (string | number)[] = ["a", 10, "b", 20];

这表示 list 可以同时包含字符串和数字。

元组(Tuple)

元组是一种特殊的数组类型,它允许你明确指定每个位置上的元素类型。例如:

typescript
let x: [string, number];
x = ["hello", 10]; // 正确
// x = [10, "hello"]; // 错误,顺序不符

console.log(x[0].substring(1)); // 类型为 string,因此可以调用 substring 方法
console.log(x[1].toFixed(2)); // 类型为 number,因此可以调用 toFixed 方法

从 TypeScript 3.5 开始,元组在剩余元素上也更加灵活,支持像 [string, ...number[]] 这样的模式。

数组的常用方法与类型安全性

TypeScript 的数组类型提供了许多 JavaScript 数组的方法,并且这些方法具有类型安全性。例如:

  • push:添加一个或多个元素到数组末尾。

    typescript
    let numbers: number[] = [];
    numbers.push(1); // 正确
    // numbers.push('not a number'); // 错误
  • pop:移除并返回数组最后一个元素。

    typescript
    let lastNumber = numbers.pop(); // 返回 number 或 undefined
  • map:创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的返回值。

    typescript
    let doubledNumbers = numbers.map((num) => num * 2);
  • filter:创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

    typescript
    let evenNumbers = numbers.filter((num) => num % 2 === 0);

只读数组(ReadonlyArray)

有时候你可能想要保护数组不被修改,这时可以使用 ReadonlyArray<T> 类型:

typescript
let readOnlyNumbers: ReadonlyArray<number> = [1, 2, 3];
// readOnlyNumbers.push(4); // 错误!不能对只读数组调用 push 方法
// readOnlyNumbers[0] = 10; // 错误!不能修改只读数组的元素

需要注意的是,虽然 ReadonlyArray 阻止了直接修改数组的操作,但它并不阻止通过其他方式间接地改变数组内容(如传递给某个函数)。要真正防止这种情况发生,你可以考虑使用深拷贝等技术。

总结

TypeScript 中的数组类型提供了一种强大而灵活的方式来处理数据集合,同时保持严格的类型检查。通过理解如何定义和使用这些类型,你可以编写出更加健壮和易于维护的代码。

Released under the MIT License.