38

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

mergeArrays(arr1 : Array, arr2 : Array);

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

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

那么两者之间是否存在编译时差异?我什么时候使用any[],什么时候使用Array?有时用Array..定义变量

var info:Array;

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

info = [[], []];
4

2 回答 2

29

这个问题的先前答案已经过时了一段时间。

首先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. 所以你必须确保你不会意外地这样做。

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

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

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

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

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

var arr: [...any[]];
var arr: any[];
于 2019-07-04T01:29:39.987 回答
17

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

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

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

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

var x = [1, 2];
x.push(3);
x[13] = 5;
于 2013-04-07T19:27:06.617 回答