### **数组**
在ts中,数组的定义方式与js中基本一样,只是需要为数组指定数据类型
```javascript
// 定义一个只能包含字符项的数组
const array: string[] = ['a','b','c']
// 正确
array.push('d')
// 报错 Argument of type '1' is not assignable to parameter of type 'string'.
array.push(1)
```
除了使用 `string[]` 这种方式定义数组之外,也可以使用`Array`构造函数的方式去定义数组
```javascript
const array1: Array<number> = [1,2,3,4,5]
```
看了上面的写法,同学们可能会疑惑,如果数组里面有不同的值,那是不是不能定义呢?这个是可以定义的,不过需要使用到一个新的概念 *联合类型(后面会讲到)*。下面我们定义一个既可以包含字符类型,也可以包含数字类型的数组
```javascript
const array2: Array<string | number> = ['string',12333]
const array3: (string | number)[] = ['string', 23222]
```
数组不仅可以包含基础类型,也可以包含对象
```javascript
type userInfoType = {
sex: number,
name: string
}
const user1: userInfoType = {
sex: 1212,
name: '姓名'
}
const array4: userInfoType[] = [user1]
```
### **元组**
前端同学们可能会对元组这个概念比较模糊,元组可以理解成一种特殊的数组,它具有固定的数组的项个数,而且数组的每一项的类型都是明确指定的,不同项的类型可以不同。
```javascript
type tuple= [string,number,boolean]
// 数组共三项,每项的类型必须与元组定的对应起来
const val: tuple = ['string', 12345, true]
```
在对元组进行赋值的时候,不仅元组每项的类型要保持一致,而且元素个数也要保持一致。对元组修改时,可以通过索引进行修改
```javascript
// 正确 索引对应类型是字符串
val[0] = 'string1'
// 报错 索引对应类型与值不对应
val[1] = '123456'
```
针对元组每一项,可以调用项类型对应的方法
```javascript
const val1: [string, number] = ['a,b,c' , 123]
// 索引0对应的string类型有split方法
const arr1: string[] = val1.split(',')
```
元组本质上也是数组,所以数组上的操作元组都可以使用,但需要注意的是,如果对数组进行越界操作,越界操作的类型必须包含在元素定义的类型里面
```javascript
const info: [string, number] = ['子君' , 25]
// 正确 ,可以push string | number 类型
info.push('男')
// 错误, Argument of type 'true' is not assignable to parameter of type 'string | number'.
info.push(true)
```
如果对元组索引值进行越界操作,在ts2.6之前与之后是不同的,在ts2.6之前,只要通过索引添加的值包含在元组定义的类型里面都是允许的,但在2.6之后是禁止的
```javascript
const info: [string, number] = ['子君' , 25]
// ts 2.6之前 正确
info[2] = '男'
// ts 2.6之后 报错
// Tuple type '[string, number]' of length '2' has no element at index '2'.
// Type '"男"' is not assignable to type 'undefined'.
info[2] = '男'
```