前言
在TypeScript中,数组类型有多种定义方式,比较灵活
「类型+方括号」表示法
js
let arr: number[] = [1,2,3,4];
arr.push('5');//数组中是不允许出现其它类型的值
Argument of type '"4"' is not assignable to parameter of type 'number'.
数组泛型
js
let arr: Array<number> = [1,2,3,4];
let arr2: Array<number | string> = [1,2,3,4, '5'];
注意:这里也不可以出现没有定义的类型值
具体看一参考:https://www.yuque.com/along-n3gko/ezt5z9/ipwwmr
用接口表示数组
用接口来描述数组,这里定义接口NumberArr,表示只要索引类型是number类型时,那么它的值就必须是number或者string
js
interface NumberArr {
[index: number]: number | string
}
let arr: NumberArr = [1,2,3,4, '5'];
如果数组想定义任意类型值
interface NumberArr {
[index: number]: any
}
let arr: NumberArr = [1,2,3,4, '5', false, {a: 1}];
----------------------------------------------------------
注意:使用接口表示数组,不可以使用数组的方法
arr.push(1); //Property 'push' does not exist on type 'NumberArr'.
类数组
类数组(Array-like Object)不是数组类型,比如arguments:
js
function sum() {
let args: number[] = arguments;
}
// Type 'IArguments' is missing the following properties from type 'number[]': pop, push, concat, join, and 24 more.
我们应该用接口去描述它。
js
function Fn () {
let arg: {
[index: number]: number;
length: number;
callee: Function
} = arguments;
console.log(arg); //[Arguments] {}
}
//定义接口约束索引为number类型,还约束了length和callee
事实上常用的类数组都有自己的接口定义,如Iarguments,NodeList,HTMLCollection等.下面的等同与上面定义的接口。
js
function Fn () {
let arg: IArguments = arguments;
console.log(arg); //[Arguments] {}
}
任意类型数组
any表示在数组中允许出现任意类型值
js
let arr: any[] = [1,'2',true, {a: 1}];