1. 定义数组类型的多种方式
      1. 【类型 + 方括号】
      2. 【泛型】
      3. 【接口】
    2. 使用【类型 + 方括号】定义数组类型
      1. **let arr: number[] = [1, 2, 3]**
      2. 推荐使用【类型 + 方括号】的写法来定义数组类型
      3. 【类型 + 方括号】写法 number[] 其实是【泛型】写法 Array<number> 的语法糖
    3. 使用【泛型】定义数组类型
      1. let arr: Array<number> = [1, 2, 3]
    4. 使用【接口】定义数组类型
      1. interface NumberArray { [index: number]: number; }
    1. // 【类型 + 方括号】
    2. let arr1: number[] = [1, 2, 3];
    3. // 【泛型】
    4. let arr2: Array<number> = [1, 2, 3];
    5. // 【接口】
    6. interface NumberArray {
    7. [index: number]: number;
    8. }
    9. let arr3: NumberArray = [1, 2, 3];
    1. 数组类型中的每一个成员类型必须保持一致
    1. // error 不能将类型“string”分配给类型“number”。
    2. let arr: number[] = [1, '2', 3];
    1. let arr: number[] = [1, 2, 3];
    2. // error 类型“string”的参数不能赋给类型“number”的参数。
    3. arr.push('8');
    1. 如果允许数组中出现任意类型,可以使用 any 数组 any[]
    1. let arr: any[] = ['123', 123, { name: 'dahuyou' }];
    2. arr.push('abc', [1, 2, 3])
    1. 数组类型的局限性:越界访问不会报错
    1. let arr: number[] = [1, 2, 3]
    2. // ok
    3. arr[10] // undefined

    如果希望 ts 能够在我们越界访问数组成员时报错,可以考虑使用元组类型来实现。

    1. 类数组(Array-like Object)不是数组类型
    2. 类数组的类型,不能用普通的描述数组的方式来描述,而应该用接口描述
    3. 常用的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等
    1. function sum() {
    2. let args: number[] = arguments;
    3. // error 类型“IArguments”缺少类型“number[]”的以下属性: pop, push, concat, join 及其他 26 项。
    4. }
    1. interface IArgs {
    2. [index: number]: number;
    3. length: number;
    4. callee: Function;
    5. }
    6. function sum1() {
    7. // ok(不推荐)
    8. let args: IArgs = arguments;
    9. }
    10. function sum2() {
    11. // ok(推荐)
    12. let args: IArguments = arguments;
    13. }
    1. 剩余参数,本质上是一个数组,可以用约束数组的方式来约束剩余参数
    1. let sum = (...args: number[]) => args.reduce((a, b) => a + b, 0)
    2. // ok
    3. sum(1) // 1
    4. // ok
    5. sum(1, 2) // 3
    6. // ok
    7. sum(1, 2, 3) // 6
    8. // error 类型“string”的参数不能赋给类型“number”的参数。
    9. sum(1, 2, '3')