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

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

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

var arr = Criminal[];

给出错误

.

.

我也试过这样做

var arr : Criminal = [];

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

'TypeScript'是怎么做的?

355279 次浏览

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

正确的方法是

var arr : Criminal[] = [];

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

希望这对其他人有所帮助!

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

我有

return [];

其中[]Criminal[]类型。

return: Criminal[] [];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>();
  1. 当变量声明的类型推断失败时,显式地指定类型是一般的解决方案。

  2. 使用类型断言(有时称为强制转换,但在TypeScript中并不是真正的强制转换)的优点适用于任何表达式,因此即使没有声明变量也可以使用它。类型断言有两种语法,但如果您关心这一点,那么只有后者可以与JSX结合使用。

  3. 使用Array构造函数只会在这个特定的用例中有所帮助,但我个人认为它是最易读的。但是,在运行时有轻微的性能影响 *。此外,如果有人疯狂到重新定义数组构造函数,的含义可能会改变

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

*:有趣的事实;在撰写本文时,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