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

dar*_*has 150 javascript arrays typescript

我在TypeScript中创建了一个名为"Three of a Crime"的简单逻辑游戏.

当尝试在TypeScript中预先分配类型化数组时,我尝试做类似这样的事情:

var arr = Criminal[];
Run Code Online (Sandbox Code Playgroud)

它给出了错误"检查表达式的格式".

也尝试过这样做

var arr : Criminal = [];
Run Code Online (Sandbox Code Playgroud)

而这产生了"无法将任何[]转换为'刑事'

什么是'TypeScript'这样做的方法?

dar*_*has 231

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

正确的方法是

var arr : Criminal[] = [];
Run Code Online (Sandbox Code Playgroud)

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

希望这有助于他人!


Tho*_*rin 104

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

// 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>();
Run Code Online (Sandbox Code Playgroud)
  1. 明确指定类型是每当类型推断对于变量声明失败时的通用解决方案.

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

  3. 使用Array构造函数只会对这个特定的用例有所帮助,但我个人觉得它最具可读性.但是,在运行时*会有轻微的性能影响.此外,如果有人疯狂到重新定义Array构造函数,那么意义可能会改变.

这是个人偏好的问题,但我发现第三种选择最具可读性.在绝大多数情况下,上述缺点可以忽略不计,可读性是最重要的因素.

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

  • 这让我相信,只有一种方法来做某事的语言是最好的。 (10认同)

Fyl*_*lax 19

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

我有

return [];
Run Code Online (Sandbox Code Playgroud)

哪里[]Criminal[]类型.

既不是return: Criminal[] [];也不return []: Criminal[];适合我.

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

为了彻底,我也会在我的答案中报告这个解决方案:

let temp: Criminal[] = [];
return temp;
Run Code Online (Sandbox Code Playgroud)

最终我发现了TypeScript类型转换,它允许我以更简洁和可读(也许更有效)的方式解决问题:

return <Criminal[]>[];
Run Code Online (Sandbox Code Playgroud)

希望这将有助于未来的读者!


小智 7

请尝试这个对我有用的方法。

return [] as Criminal[];
Run Code Online (Sandbox Code Playgroud)