TypeScript 元组(Tuple)
本节介绍这一数据类型的定义及其使用,通过可以存储不同类型的元素,而非像数组那样只能存储相同元素类型(any[] 除外)。
相同类型元素组成成为数组,不同类型元素组成了(Tuple)。
声明由 string
和 number
构成的:
const list: [string, number] = ['Sherlock', ] // ok
const list1: [string, number] = [, 'Sherlock'] // error
解释: 中规定的元素类型顺序必须是完全对照的,而且不能多、不能少,list1
中定义的第元素为 string
类型,不能赋值为 number
类型的数据。
当赋值或访问已知索引的元素时,会得到正确的类型:
const list: [string, number] = ['Sherlock', ]
list[].substr() // ok
list[].substr() // Property 'substr' does not exist on type 'number'.
解释:
第 3 行,list[0]
是字符串类型,拥有 sub 。
第 4 行,list[1]
是数字类型,没有 sub ,所以报错。
要注意的越界问题,虽然可以越界元素(不建议),但是不可越界访问:
const list: [string, number] = ['Sherlock', ]
list.push('hello world')
console.log(list) // ok [ 'Sherlock', 1887, 'hello world' ]
console.log(list[]) // Tuple type '[string, number]' of length '2' has no element at index '2'
解释:
第 2 行,向声明了只有两个元素的继续元素,这种操作虽然可行,但是严重不建议!
第 5 行,该只有两个元素,不可越界访问第三个元素。
类型允许在元素类型后缀 ?
来说明元素是可选的:
const list: [number, string?, boolean?]
list = [, 'Sherlock', true]
list = [, 'Sherlock']
list = []
解释: 可选元素必须在必选元素的后面,也就是如果元素后缀了 ?
号,其后的所有元素都要后缀 ?
号。
可以作为参数传递给,的 Rest 形参可以定义为类型:
declare function rest(...args: [number, string, boolean]): void
等价于:
declare function rest(arg1: number, arg2: string, arg3: boolean): void
TIPS: 在声明(.d.ts)中,关键字 declare 表示声明作用。声明用于编写第三方类库,通过配置 tscon.json
中的 declaration 为 true
,在编译时可自行。
还可以这样:
const list: [number, ...string[]] = [, 'a', 'b', 'c']
const list1: [string, ...number[]] = ['a', , , ]
解释: Rest 元素指定了类型是无限扩展的,可能有零个或多个具有数组元素类型的额外元素。
本小节介绍了类型的声明方式和一些技巧,在实际开发中可以灵活应用。