### **數組**
在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] = '男'
```