我在TypeScript中创建了一个名为“Three of a Crime”的简单逻辑游戏。
当尝试在TypeScript中预先分配类型化数组时,我尝试做类似这样的事情:
var arr = Criminal[];
给出了错误 “检查表达术语的格式”。
也尝试过这样做
var arr : Criminal = [];
并且这产生了“无法将任何[]转换为'刑事'
这种'TypeScript'方式是什么?
答案 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>();
明确指定类型是每当类型推断无法进行变量声明时的通用解决方案。
使用type assertion(有时称为强制转换,但它并不是TypeScript中的强制转换)的优势适用于任何表达式,因此即使没有变量也可以使用它声明。类型断言有两种语法,但如果你关心它,只有后者才能与JSX结合使用。
使用Array构造函数只能帮助您解决这个特定的用例,但我个人觉得这个用例最具可读性。但是,运行时*会有轻微的performance impact。此外,如果某人疯狂到重新定义Array构造函数,the meaning could change。
这是个人偏好的问题,但我发现第三种选择最具可读性。在绝大多数情况下,所提到的缺点可以忽略不计,可读性是最重要的因素。
*:有趣的事实;在撰写本文时,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。