TypeScript 元组(Tuple)
相同类型元素组成成为数组,不同类型元素组成了元组(Tuple)。元组可以存储不同类型的元素,而非像数组那样只能存储相同元素类型(any[] 除外)。
1.定义元组类型
声明一个由 string
和 number
构成的元组:
const list: [string, number] = ['Sherlock', 1887] // ok
const list1: [string, number] = [1887, 'Sherlock'] // error
元组中规定的元素类型顺序必须是完全对照的,而且不能多、不能少,list1
中定义的第一个元素为 string
类型,不能赋值为 number
类型的数据。
要注意元组的越界问题,虽然可以越界添加元素(不建议),但是不可越界访问:
const list: [string, number] = ['Sherlock', 1887]
list.push('hello world')
console.log(list) // ok [ 'Sherlock', 1887, 'hello world' ]
console.log(list[2]) // Tuple type '[string, number]' of length '2' has no element at index '2'
2.可选元素类型
元组类型允许在元素类型后缀一个 ?
来说明元素是可选的:
const list: [number, string?, boolean?]
list = [10, 'Sherlock', true]
list = [10, 'Sherlock']
list = [10]
可选元素必须在必选元素的后面,也就是如果一个元素后缀了 ?
号,其后的所有元素都要后缀 ?
号。
3.元组类型的 Rest 使用
元组可以作为参数传递给函数,函数的 Rest 形参可以定义为元组类型:
function rest(...args: [number, string, boolean]): void
还可以这样:
const list: [number, ...string[]] = [10, 'a', 'b', 'c']
const list1: [string, ...number[]] = ['a', 1, 2, 3]
Rest 元素指定了元组类型是无限扩展的,可能有零个或多个具有数组元素类型的额外元素。