数组类型(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:添加一个或多个元素到数组末尾。
typescriptlet numbers: number[] = []; numbers.push(1); // 正确 // numbers.push('not a number'); // 错误pop:移除并返回数组最后一个元素。
typescriptlet lastNumber = numbers.pop(); // 返回 number 或 undefinedmap:创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的返回值。
typescriptlet doubledNumbers = numbers.map((num) => num * 2);filter:创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。
typescriptlet 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 中的数组类型提供了一种强大而灵活的方式来处理数据集合,同时保持严格的类型检查。通过理解如何定义和使用这些类型,你可以编写出更加健壮和易于维护的代码。