在TypeScript中,Array
和any[]
有什么区别?Array是指动态大小的数组(当然是在编译时),而any[]
是指作为参数传递并由编译器进行类型推断的静态大小的数组吗?因为目前当我有这样的功能:
mergeArrays(arr1 : Array, arr2 : Array);
当您使用静态数据调用此函数时,TypeScript使用类型化数组(type[]
)。
mergeArrays([true, false], [1, 2]);
// bool[] number[]
那么这两个版本在编译时有什么不同吗?什么时候使用any[]
,什么时候使用Array
?有时用Array
定义变量。
var info:Array;
..当设置如下时,会显示类似“无法将任何[][]转换为Array”的错误:
info = [[], []];
2条答案
按热度按时间lp0sw83n1#
以前对这个问题的回答已经过时了一段时间。
首先,
Array
需要一个泛型参数:这相当于:
类型
Array<any>
和any[]
相同,都是可变/动态大小的数组。Typescript 3.0引入了元组,元组类似于固定/静态大小的数组,但实际上并不是。
让我解释一下。
它们的语法如下所示:
Typescript将强制您分配一个具有该长度和具有匹配类型的值的数组。
当你索引数组时,类型脚本将识别该索引处的变量类型。
有趣的是,typescript不会阻止您修改Tuple的大小,无论是通过使用
.push()
这样的函数,还是通过向length
赋值。所以你要确保你不是偶然的。您还可以为任何额外的元素指定“rest”类型:
在这种情况下,您可以为Tuple分配更多项,并且数组的大小可能会更改。
注意:不能将普通数组分配给元组。
如果你只指定了一个rest类型,那么你会得到一个常规的旧数组。
以下两个表达式是等效的:
wr98u20j2#
规范第3.5.4节规定了它们的关系:
ElementType[]
形式的数组类型等价于索引签名为[index: number]: ElementType
的对象类型加上一组等价于全局接口类型Array
的成员,其中所有出现的magic_element
类型都被ElementType
替换。不能将
[[], []]
或[]
分配给Array
是一个bug。在TypeScript中没有“静态大小”数组的概念。他们都在谈论相同的底层JavaScript数组(动态大小):