Typescript Array vs any[]

ljsrvy3e  于 2023-05-30  发布在  TypeScript
关注(0)|答案(2)|浏览(182)

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

mergeArrays(arr1 : Array, arr2 : Array);

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

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

那么这两个版本在编译时有什么不同吗?什么时候使用any[],什么时候使用Array?有时用Array定义变量。

var info:Array;

..当设置如下时,会显示类似“无法将任何[][]转换为Array”的错误:

info = [[], []];
lp0sw83n

lp0sw83n1#

以前对这个问题的回答已经过时了一段时间。
首先,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将强制您分配一个具有该长度和具有匹配类型的值的数组。
当你索引数组时,类型脚本将识别该索引处的变量类型。
有趣的是,typescript不会阻止您修改Tuple的大小,无论是通过使用.push()这样的函数,还是通过向length赋值。所以你要确保你不是偶然的。
您还可以为任何额外的元素指定“rest”类型:

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

在这种情况下,您可以为Tuple分配更多项,并且数组的大小可能会更改。
注意:不能将普通数组分配给元组。
如果你只指定了一个rest类型,那么你会得到一个常规的旧数组。
以下两个表达式是等效的:

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

wr98u20j2#

规范第3.5.4节规定了它们的关系:
ElementType[]形式的数组类型等价于索引签名为[index: number]: ElementType的对象类型加上一组等价于全局接口类型Array的成员,其中所有出现的magic _element类型都被ElementType替换。
不能将[[], []][]分配给Array是一个bug。
在TypeScript中没有“静态大小”数组的概念。他们都在谈论相同的底层JavaScript数组(动态大小):

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

相关问题