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

时间:2013-04-05 05:43:23

标签: javascript arrays typescript

我在TypeScript中创建了一个名为“Three of a Crime”的简单逻辑游戏。

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

var arr = Criminal[];

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

也尝试过这样做

var arr : Criminal = [];

并且这产生了“无法将任何[]转换为'刑事'

这种'TypeScript'方式是什么?

6 个答案:

答案 0 :(得分:195)

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

正确的方法是

var arr : Criminal[] = [];

这将为您提供存储在变量'arr'

中的正确类型的空数组

希望这有助于其他人!

答案 1 :(得分:84)

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

// 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. 使用type assertion(有时称为强制转换,但它并不是TypeScript中的强制转换)的优势适用于任何表达式,因此即使没有变量也可以使用它声明。类型断言有两种语法,但如果你关心它,只有后者才能与JSX结合使用。

  3. 使用Array构造函数只能帮助您解决这个特定的用例,但我个人觉得这个用例最具可读性。但是,运行时*会有轻微的performance impact。此外,如果某人疯狂到重新定义Array构造函数,the meaning could change

  4. 这是个人偏好的问题,但我发现第三种选择最具可读性。在绝大多数情况下,所提到的缺点可以忽略不计,可读性是最重要的因素。

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

答案 2 :(得分:15)

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

我有

return [];

其中[]Criminal[]类型。

return: Criminal[] [];return []: Criminal[];都不适合我。

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

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

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

最终我发现了TypeScript类型转换,这使我能够以更简洁,可读(也许更有效)的方式解决问题:

return <Criminal[]>[];

希望这将有助于未来的读者!

答案 3 :(得分:2)

请试试这个对我有用的方法。

return [] as Criminal[];

答案 4 :(得分:0)

对于公共访问,如下所示:

public arr: Criminal[] = [];

答案 5 :(得分:0)

好的,这里的语法有误,正确的方法是:

var arr: Criminal[] = [];

我假设您正在使用var,这意味着将其声明为func()内的某个地方,我的建议是使用let而不是var

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