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

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

var arr = Criminal[];

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

我也试过这样做

var arr : Criminal = [];

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

'TypeScript'是怎么做的?


当前回答

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

var arr: Criminal[] = [];

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

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

其他回答

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

public arr: Criminal[] = [];

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

正确的方法是

var arr : Criminal[] = [];

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

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

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

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

var arr: Criminal[] = [];

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

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