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

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

var arr = Criminal[];

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

我也试过这样做

var arr : Criminal = [];

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

'TypeScript'是怎么做的?


当前回答

TLDR:

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

深度:

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

var arr = [];

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

any[]

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

var arr: Criminal[] = [];

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

其他回答

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

正确的方法是

var arr : Criminal[] = [];

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

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

public arr: Criminal[] = [];

TLDR:

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

深度:

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

var arr = [];

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

any[]

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

var arr: Criminal[] = [];

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

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

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