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

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

var arr = Criminal[];

给出了误差 “检查表达式项的格式”。

我也试过这样做

var arr : Criminal = [];

这就产生了“不能将任何[]转化为‘罪犯’”

'TypeScript'是怎么做的?


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

正确的方法是

var arr : Criminal[] = [];

这将为您提供一个正确键入的空数组,存储在变量'arr'中

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

我有

return [];

其中[]为Criminal[]类型。

不返回:刑事[][];也不返回[]:犯罪[];为我工作。

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

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

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

最终,我找到了TypeScript类型转换,这让我能够以一种更简洁和可读(可能也更有效)的方式解决问题:

return <Criminal[]>[];

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

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

// 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>();

Explicitly specifying the type is the general solution for whenever type inference fails for a variable declaration. The advantage of using a type assertion (sometimes called a cast, but it's not really a cast in TypeScript) works for any expression, so it can be used even when no variable is declared. There are two syntaxes for type assertions, but only the latter will work in combination with JSX if you care about that. Using the Array constructor is something that will only help you in this specific use case, but which I personally find the most readable. However, there is a slight performance impact at runtime*. Also, if someone were crazy enough to redefine the Array constructor, the meaning could change.

这是个人偏好的问题,但我觉得第三个选项最有可读性。在绝大多数情况下,上述缺点可以忽略不计,可读性是最重要的因素。

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

用于公开访问的用途如下:

public arr: Criminal[] = [];

你的语法错了,正确的做法是:

var arr: Criminal[] = [];

我假设你正在使用var,这意味着在func()中声明它,我的建议是使用let而不是var。

如果将其声明为c类属性,则使用访问修饰符,如private, public, protected。

请试试这个,它对我有用。

return [] as Criminal[];

TLDR:

// explicitly type the variable arr
var arr: Criminal[] = [];

深度:

如果我们有一个没有元素的数组,比如:

var arr = [];

TS没有办法在编译时知道数组中会有什么,并且arr的类型将是:

any[]

然后,程序员的工作就是告诉TS数组的类型,这可以用类型注释来完成:

var arr: Criminal[] = [];

如果我们从数组中取出一个元素Typescript知道这个元素的类型是Criminal。