在TypeScript中,Array
和any[]
之间有什么区别? Array是否引用动态大小的数组(当然是在编译时)和any[]
是指作为参数传递的静态大小的数组并由编译器输入类型?因为目前我有以下功能:
mergeArrays(arr1 : Array, arr2 : Array);
使用静态数据调用此函数时,TypeScript使用类型化数组(type[]
)。
mergeArrays([true, false], [1, 2]);
// bool[] number[]
那么2之间是否存在编译时差异?我何时使用any[]
,何时使用Array
?有时使用Array
..
var info:Array;
..在设置如下时显示“无法将任何[] []转换为数组”之类的错误:
info = [[], []];
答案 0 :(得分:11)
规范第3.5.4节规定了它们之间的关系:
形式
ElementType[]
的数组类型等同于具有索引签名[index: number]: ElementType
的对象类型以及一组等同于全局接口类型Array
的成员,其中所有出现的都是magic_element
类型已替换为ElementType
。
无法将[[], []]
或[]
分配给Array
是一个错误。
TypeScript中没有“静态大小”数组的概念。他们都在谈论相同的底层JavaScript数组(动态大小):
var x = [1, 2];
x.push(3);
x[13] = 5;
答案 1 :(得分:1)
这个问题的先前答案已经过时了一段时间。
首先Array
需要一个通用参数:
var arr: Array<any>;
这等效于:
var arr: any[];
类型Array<any>
和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[]];
在这种情况下,您可以将更多项目分配给元组,并且数组的大小可能会更改。
注意:您不能将常规数组分配给元组。
如果仅指定休息类型,则将获得常规的旧数组。
以下两个表达式是等效的:
var arr: [...any[]];
var arr: any[];