2.2.3 数组与元组
和JavaScript类似,TypeScript也方便操作一组元素。数组比数值、字符串这些类型要略微复杂一些,因为数组的类型是与其中所存放的元素类型有关的。声明数组的类型有两种方式,一种是采用“类型+中括号”来指定数组类型,另一种是通过“Array+泛型”来指定数组类型。
示例如下。
【源码见附件代码/第2章/5.array-tuple/5.array-tuple.ts】
var list1: number[] = [1, 2, 3];
number[]将指定变量的类型为数组类型,并且数组中的元素必须都是数值类型的。如果此时向数组中追加非数值类型的元素,则会编译报错。
同样也可以使用如下代码来声明数组的类型。
【源码见附件代码/第2章/5.array-tuple/5.array-tuple.ts】
var list2: Array<string> = ["a", "b", "c"]
关于泛型的使用,我们后续还会专门介绍,这里不做过多解释。
需要注意,变量一旦被指定了严格的数组类型,则数组中的元素类型也是严格的,无论是数组赋值还是向其内部插入元素,元素的类型都必须是正确的。如果一个数组中需要存放多种类型的元素,则我们可以使用联合类型或任意类型来指定,后面会详细介绍。
元组是TypeScript中增加的数据类型,JavaScript并不支持,但是元组本身并不是一个新的概念,在许多编程语言中都有元组类型。在TypeScript中,元组本身也是数组,只是其支持合并不同类型的对象,简单理解,就是我们可以将一组不同数据类型的数组组合到一个盒子里,类似于套餐的感觉。
一个简单的元组类型示例如下:
【源码见附件代码/第2章/5.array-tuple/5.array-tuple.ts】
var tuple1: [string, number] = ["XiaoMing", 25]
此元组的本意是用来记录用户的名字与年龄,名字一般为字符串类型,年龄则为数值类型。在使用元组时,我们可以按照和数组类似的方式来取值,示例如下:
【源码见附件代码/第2章/5.array-tuple/5.array-tuple.ts】
//name is XiaoMing, age is 25 console.log('name is ${tuple1[0]}, age is ${tuple1[1]}');
同样,在对元组变量进行赋值时,也支持对其中某个元素进行赋值,但是类型必须与所定义的一致,示例如下:
tuple1[0] = "DaShuai"
我们知道数组是可以通过调用push方法来追加元素的,元组的本质是数组,那么它也支持这样的操作,只是如果我们追加的元素超出了声明时所定义类型的个数,则后续的元素类型会被当作元组内所有支持的元素类型的联合类型。以上面的代码为例,我们定义的元组中元素的类型支持字符串和数值,则当向元组中添加第3个元素时,其可以是字符串类型,也可以是数值类型,这也是联合类型的核心作用,后面会详细介绍。例如下面的代码是合法的:
【代码片段2-5 源码见附件代码/第2章/5.array-tuple/5.array-tuple.ts】
var tuple1: [string, number] = ["XiaoMing", 25] tuple1.push("TypeScript"); tuple1.push(1101);
但是需要注意,从代码语法设计上,元组应该被理解为不可任意增加元素的集合,上面的代码从TypeScript的设计层面来看是不应该被允许的。我们也应该尽量避免如此使用元组。
最后,JavaScript中数组的用法不在我们的讨论范围之内,JavaScript本身已经支持许多数组操作方法,包括拼接、分割、追加、删除等,如果读者尚有疑惑,可以自行查阅相关资料了解。