TypeScript学习笔记(三)- 数组

301 阅读1分钟

在 TypeScript 中,数组类型有多种定义方式。

类型 + 方括号

第一种方法是使用「类型 + 方括号」来表示数组:

let arr: number[] = [1, 2, 3, 4, 5]

let arr2: number[] = [1, '2', 3]
// Type 'string' is not assignable to type 'number'.

arr.push('6');
// Argument of type '"8"' is not assignable to parameter of type 'number'.

数组泛型

可以使用数组泛型(Array Generic) Array<> 来表示数组:

let arr: Array<number> = [1, 2, 3, 4, 5]

接口表示数组法

接口也可以用来描述数组:

innerface NumberArray {
  [index: number]: number;
}

ler arr: NumberArray = [1, 2, 3]

用接口表示数组,复杂度会高于上边那种表示方法。但是有一种例外是类数组。

类数组

类数组不能用数组类型去表示:

function fn() {
  let args: number[] = arguments;
}

// Type 'IArguments' is missing the following properties from type 'number[]': pop, push, concat, join, and 24 more.

上例可以看出,arguments类型不能用数组表示法表示,而要用接口:

function fn() {
    let args: {
        [index: number]: number;
        length: number;
        callee: Function;
    } = arguments;
}

在这个例子中,我们除了约束当索引的类型是数字时,值的类型必须是数字之外,也约束了它还有 length 和 callee 两个属性。

事实上常用的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等:

function fn() {
    let args: IArguments = arguments;
}

其中 IArguments 是 TypeScript 中定义好了的类型,如下:

interface IArguments {
    [index: number]: any;
    length: number;
    callee: Function;
}

IArguments, NodeList, HTMLCollection实际上是它的内置对象。

Any在数组中的应用

用 any 可以表示数组中允许出现任意类型:

let arr: any[] = ['123', 10, { a: 1 }];

参考

TypeScript 入门教程 - ts.xcatliu.com/

TypeScript 官网 - www.typescriptlang.org/