您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

TypeScript 元组(Tuple)

本节介绍这一数据类型的定义及其使用,通过可以存储不同类型的元素,而非像数组那样只能存储相同元素类型(any[] 除外)。

相同类型元素组成成为数组,不同类型元素组成了(Tuple)。

声明由 stringnumber 构成的:

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 元素指定了类型是无限扩展的,可能有零个或多个具有数组元素类型的额外元素。

本小节介绍了类型的声明方式和一些技巧,在实际开发中可以灵活应用。


联系我
置顶