TypeScript:创建一个空的类型化容器数组


180

我正在用TypeScript创建一个简单的逻辑游戏,叫做“犯罪三”。

当尝试在TypeScript中预分配类型化数组时,我尝试执行以下操作:

var arr = Criminal[];

出现错误“检查表达式的格式”。

也尝试这样做

var arr : Criminal = [];

并且产生了“无法将any []转换为'Criminal'

“ TypeScript”执行此操作的方式是什么?

Answers:


162

现有答案错过了一个选项,因此这里是完整列表:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. 显式指定类型是在变量声明的类型推断失败时的通用解决方案。

  2. 使用类型断言(有时称为类型转换,但在TypeScript中不是真正的类型转换)的优点适用于任何表达式,因此即使没有声明变量也可以使用它。类型声明有两种语法,但是如果您关心的话,只有后者可以与JSX结合使用。

  3. 使用Array构造函数只会帮助您解决此特定用例,但我个人认为这是最易读的。但是,在运行时对性能有轻微影响 *。另外,如果有人疯狂地重新定义Array构造函数,则含义可能会改变

这是个人喜好问题,但是我发现第三个选项最容易理解。在绝大多数情况下,上述缺点可以忽略不计,而可读性是最重要的因素。

*: 有趣的事实; 在撰写本文时,Chrome中的性能差异为60%,而Firefox中没有可测量的性能差异。


60%?? :O那太疯狂了
Max Coplan

239

由于数组文字语法的原因,在TypeScript中正确预分配类型化数组的问题有些模糊,因此它不像我最初想到的那样直观。

正确的方法是

var arr : Criminal[] = [];

这将为您提供存储在变量“ arr”中的正确类型的空数组

希望这对别人有帮助!


20

我知道这是一个老问题,但是最近我遇到了类似的问题,这种问题无法用这种方法解决,因为我必须返回特定类型的空数组。

我有

return [];

这里[]Criminal[]类型。

return: Criminal[] [];没有return []: Criminal[];为我工作,也没有为我工作。

乍一看,我通过在返回值之前创建一个类型化变量(如您所正确报告的)来解决它,但是(我不知道JavaScript引擎如何工作)它可能会产生开销,并且可读性较差。

为了彻底,我也将在答案中报告此解决方案:

let temp: Criminal[] = [];
return temp;

最终,我发现了TypeScript类型转换,这使我能够以更简洁,可读性更好(也许更有效)的方式解决问题:

return <Criminal[]>[];

希望这对以后的读者有所帮助!


1

对于公共访问,如下所示:

public arr: Criminal[] = [];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.