在TypeScript中,数组类型有多重定义方式,比较灵活。
「类型+方括号」表示法
let num: number[] = [1, 3, 4, 5]
num.push('8') // 报错,只允许传入number类型的参数
let num1: number[] = [1, 2, 4, '6'] // 报错,不允许出现其他类型
数组泛型
我们也可以是使用数组泛型 Array<elemType>
来表示数组:
let num: Array<number> = [3, 4, 5]
用接口表示数组
接口也可以用来描述数组:
interface NumberArray {
[index: number]: number
}
let num: NumberArray = [3, 4, 6, 8]
NumberArray
表示:只要索引的类型是数字时,那么值的类型必须是数字。
虽然接口也可以用来描述数组,但是我们一般不会这样做,因为这种方式比前两种复杂多了。
类数组
类数组不是数组类型,比如 arrguments
:
function sum() {
let args: number[] = arguments
}
// 报错,Type 'IArguments' is missing the following properties from type 'number[]': pop, push, concat, join, and 24 more.
上例中,arguments
实际上是一个类数组,不能用普通的数组的方式来描述,而应该用接口:
interface Arg {
[index: number]: number
length: number
callee: Function
}
function num() {
let args: Arg = arguments
}
事实上,常用的类数组都有自己的接口定义,如 IArguments
,NodeList
,HTMLCollection
等:
function sum() {
let args: IArguments = arguments
}
其中 IArguments
是TypeScript中定义好了的类型,它实际上就是:
interface IArguments {
[index: number]: any
length: number
callee: Function
}
any 在数组中的应用
一个比较常见的做法是,用 any
表示数组中允许出现任意类型:
let list: any[] = ['tom', 44, { url: 'http://www.baidu.com' }]