Skip to content

数组的类型

TypeScript中,数组类型有多种定义方式,比较灵活。

类型+[方括号]表示
    let fibonacci:number[]=[1,2,3];

数组的类型中不允许出现其他类型:

    let fibonacci:number[]=[1,2,"3"];//不能将类型"string"分配给类型"number"。

数组的一些方法的参数也会根据数组在定义时约定的类型进行限制:

    let fibonacci:number[]=[1,2,3];
    fibonacci.push('1') // 类型""1""的参数不能赋给类型"number"的参数。

上个例子中,数组被限制了数值类型,所以对应的方法也被限制住了,不允许进行添加字符串类型的值。

数组泛类型

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

    let fibonacci:Array<number> = [1,1,2,3,5]
用接口表示数组

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

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

    let fibonacci:NumberArray = [1,2,3,4]

NumberArray表示:只要索引的类型是数字时,那么值的类型必须是数字。 虽然接口也可以用来描述数组,但是我们一般不建议这么做,因为这种方式比前两两种方式复杂多了。 不过有一种情况例外,那就是它常用来表示类数组。

类数组

类数组(Array-like Object)不是数组类型,比如arguments:

function sum(){
    let args:number[]=arguments; // 类型"IArguments"缺少类型"number[]"的以下属性: pop, push, concat, join 及其他 15 项。
}

上面因为arguments不是数组,所以直接使用普通的数组方式来描述报错,而应该使用接口:

    function sum(){
        interface args  {
            [index:number] : number ,

        }

        let args:args=arguments;

    }

也可以写成:

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

常用的类数组都有自己的定义,如IArguments,NodeList,HTMLCollection等:

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

IArgumentsTypeScript中定义好的类型:

    interface IArguments {
        [index: number]: any;
        length: number;
        callee: Function;
    }
any在数组中的应用

一个比较常见的做法是,用any表示数组中允许出现任意类型:

    let list:any[] = [1,2,'3',{}]