261

我正在 TypeScript 中创建简单的逻辑游戏,称为“犯罪之三”。

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

var arr = Criminal[];

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

也试过这样做

var arr : Criminal = [];

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

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

4

6 回答 6

335

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

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

于 2017-04-05T12:10:42.087 回答
249

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

正确的方法是

var arr : Criminal[] = [];

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

希望这对其他人有帮助!

于 2013-04-05T05:43:23.357 回答
27

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

我有

return [];

[]类型在哪里Criminal[]

既不为我工作,return: Criminal[] [];也不return []: Criminal[];为我工作。

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

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

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

最终我找到了 TypeScript 类型转换,它让我能够以一种更简洁、更易读(并且可能更高效)的方式解决问题:

return <Criminal[]>[];

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

于 2016-08-09T08:46:15.007 回答
5

请试试这个对我有用的。

return [] as Criminal[];
于 2021-01-26T22:14:49.327 回答
2

供公众访问使用,如下所示:

public arr: Criminal[] = [];
于 2019-04-22T14:21:40.133 回答
2

好的,您在这里的语法错误,正确的方法是:

var arr: Criminal[] = [];

func()我假设您正在使用 var ,这意味着letvar.

如果将其声明为 c 类属性,则使用私有、公共、受保护等访问修饰符。

于 2020-11-01T07:26:40.707 回答