在 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/