打字稿数组与任何[]

时间:2013-04-07 09:08:06

标签: javascript typescript types

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

mergeArrays(arr1 : Array, arr2 : Array);

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

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

那么2之间是否存在编译时差异?我何时使用any[],何时使用Array?有时使用Array ..

定义变量
var info:Array;

..在设置如下时显示“无法将任何[] []转换为数组”之类的错误:

info = [[], []];

2 个答案:

答案 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[];