【问题标题】:Typescript Array vs any[]打字稿数组与任何 []
【发布时间】:2019-07-04 09:29:39
【问题描述】:

在 TypeScript 中,Arrayany[] 有什么区别? Array 是否指的是动态大小的数组(当然是在编译时),any[] 是否指的是作为参数传递并由编译器推断类型的静态大小的数组?因为目前当我有以下功能时:

mergeArrays(arr1 : Array, arr2 : Array);

当您使用静态数据调用此函数时,TypeScript 使用类型化数组 (type[])。

mergeArrays([true, false],  [1, 2]);
//          bool[]          number[]

那么两者之间有任何编译时差异吗?我什么时候使用any[],什么时候使用Array?有时用Array.. 定义变量。

var info:Array;

..如下设置时出现“Cannot convert any[][] to Array”之类的错误:

info = [[], []];

【问题讨论】:

    标签: javascript typescript types


    【解决方案1】:

    之前对这个问题的回答已经过时了一段时间了。

    首先Array需要一个泛型参数:

    var arr: Array<any>;
    

    这相当于:

    var arr: any[];
    

    Array&lt;any&gt;any[] 类型相同,都引用可变/动态大小的数组。

    Typescript 3.0 引入了元组,它们类似于具有固定/静态大小的数组,但实际上并非如此。

    让我解释一下。

    它们的语法如下:

    var arr: [any];
    var arr: [any, any];
    var arr: [any, any, any];
    var arr: [string, number, string?, MyType];
    

    Typescript 将强制您分配该长度的数组,并使用具有匹配类型的值。
    当您索引数组时,打字稿将识别该索引处的变量类型。

    有趣的是,打字稿不会阻止您修改元组的大小,无论是通过使用像.push() 这样的函数还是通过为length 分配一个值。所以你必须确保你不会偶然这样做。

    您还可以为任何额外的元素指定“休息”类型:

    var arr: [any, any, ...any[]];
    var arr: [string, number, string?, MyType, ...YourType[]];
    

    在这种情况下,您可以将更多项分配给元组,并且数组的大小可能会发生变化。

    注意:您不能将普通数组分配给元组。

    如果你只指定一个休息类型,那么你会得到一个普通的旧数组。
    以下2个表达式是等价的:

    var arr: [...any[]];
    var arr: any[];
    

    【讨论】:

      【解决方案2】:

      规范第 3.5.4 节指定了它们的关系:

      ElementType[] 形式的数组类型等效于具有索引签名[index: number]: ElementType 加上一组等效于全局接口类型Array 的对象类型,其中所有出现的魔术_element 类型是替换为ElementType

      无法将[[], []][] 分配给Array 是一个错误。

      TypeScript 中没有“静态大小”数组的概念。他们都在谈论相同的底层 JavaScript 数组(动态调整大小):

      var x = [1, 2];
      x.push(3);
      x[13] = 5;
      

      【讨论】:

        猜你喜欢
        • 2022-08-02
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 2021-10-17
        • 1970-01-01
        • 2021-01-02
        • 2020-02-02
        相关资源
        最近更新 更多