TypeScript 元组学习笔记
什么是元组?
元组(Tuple)是 TypeScript 中的一种数据类型,它表示一个已知元素数量和类型的数组,各元素的类型不必相同。
在 JavaScript 中,我们可以通过数组来存储一组数据,但是数组的每个元素都可以是任意类型,而 TypeScript 的元组则要求数组中每个元素的类型都与预先定义好的类型相符。
如何定义元组?
定义元组的语法很简单,只需要在定义数组时给每个元素指定类型即可。例如:
typescriptCopy Codelet tuple1: [string, number];
let tuple2: [boolean, string, number];
上述示例中,tuple1
只包含两个元素,第一个元素为字符串类型,第二个元素为数字类型。而 tuple2
包含三个元素,类型分别为布尔值、字符串和数字。
如何访问元组的元素?
访问元组的元素与访问数组的元素类似,使用索引即可。不过需要注意的是,由于元组中各个元素的类型可能不同,因此不能对元素进行默认的操作。例如:
typescriptCopy Codelet tuple: [string, number];
tuple = ['hello', 10];
console.log(tuple[0].substring(1)); // OK
console.log(tuple[1].substring(1)); // Error, 'number' does not have 'substring'
在上面的代码中,我们尝试对 tuple
中的第二个元素进行 substring
操作,但是由于该元素的类型为数字,因此会出现编译错误。
元组的特殊用法
元组除了作为定义固定元素数量和类型的数组之外,还有一些特殊的用法。
变长元组
在定义元组时,可以使用 ...
来指定一个变长元组(Rest 元组),即该元组中除了已知的类型之外还包含额外的元素。例如:
typescriptCopy Codelet tuple: [string, number, ...boolean[]];
tuple = ['hello', 10, true, false]; // OK
tuple = ['hello', 10, true, false, 'error']; // Error, 'string' is not assignable to type 'boolean'
上面的代码中,我们定义了一个变长元组,它包含一个字符串和一个数字,后面跟着任意数量的布尔值。因此,第一个赋值语句是正确的,而第二个赋值语句由于多了一个字符串导致编译错误。
只读元组
在 TypeScript 3.4 以后的版本中,可以使用 readonly
关键字来定义只读元组。这意味着在元组被初始化之后,它的元素不能再被修改。例如:
typescriptCopy Codelet tuple: readonly [string, number] = ['hello', 10];
tuple[0] = 'world'; // Error, Index signature in type 'readonly [string, number]' only permits reading.
上面的代码中,我们定义了一个只读元组,它包含一个字符串和一个数字。由于该元组是只读的,因此在对其元素进行修改时会出现编译错误。
实例
我们来看一个使用元组的实例,假设我们需要定义一个表示三维坐标的点的类型。我们可以这样定义:
typescriptCopy Codetype Point3D = [number, number, number];
接着,我们可以定义一个函数,计算两个点之间的距离:
typescriptCopy Codefunction distance(p1: Point3D, p2: Point3D): number {
const dx = p1[0] - p2[0];
const dy = p1[1] - p2[1];
const dz = p1[2] - p2[2];
return Math.sqrt(dx ** 2 + dy ** 2 + dz ** 2);
}
console.log(distance([1, 2, 3], [4, 5, 6])); // 5.196152422706632
在上面的代码中,我们使用 Point3D
元组类型来表示一个三维坐标点,并定义了一个 distance
函数,该函数接受两个 Point3D
类型的参数,返回它们之间的距离。最后,我们调用 distance
函数并打印结果。