开发者问题收集

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

2013-04-05
423168

我正在用 TypeScript 创建名为“Three of a Crime”的简单逻辑游戏。

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

var arr = Criminal[];

这给出了错误 “检查表达式术语的格式”。

也尝试这样做

var arr : Criminal = [];

这产生了“无法将任何[]转换为'Criminal'

什么是'TypeScript'方式来做到这一点?

3个回答

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

// 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 中没有可衡量的性能差异。

Thorarin
2017-04-05

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

正确的方法是

var arr : Criminal[] = [];

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

darethas
2013-04-05

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

我有

return [];

其中 []Criminal[] 类型。

return: Criminal[] [];return []: Criminal[]; 都不适合我。

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

为了全面起见,我也将在我的回答中报告此解决方案:

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

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

return <Criminal[]>[];

希望这会对未来的读者有所帮助!

Fylax
2016-08-09