TypeScripttypes的数组用法

我有一个TypeScript类的定义,像这样开始;

module Entities { export class Person { private _name: string; private _possessions: Thing[]; private _mostPrecious: Thing; constructor (name: string) { this._name = name; this._possessions = new Thing[100]; } 

看起来像一个types的数组Thing没有得到正确的翻译到相应的JavaScript数组types。 这是生成的JavaScript代码片段:

 function Person(name) { this._name = name; this._possessions = new Entities.Thing[100](); } 

执行包含Person对象的代码时,在尝试初始化_possession字段时引发exception:

错误是“0x800a138f – Microsoft JScript运行时错误:无法获取属性的值'100':对象为空或未定义”。

如果我将_possession的types更改为any[]并且用new Array()exception不会引发_possession。 我错过了什么?

你的语法错误在这里:

 this._possessions = new Thing[100](); 

这不会创build一个“数组”。 要创build一个数组,可以简单地使用数组文字expression式:

 this._possessions = []; 

数组构造函数如果你想设置长度:

 this._possessions = new Array(100); 

我已经创build了一个简单的工作例子,你可以在操场上试试。

 module Entities { class Thing { } export class Person { private _name: string; private _possessions: Thing[]; private _mostPrecious: Thing; constructor (name: string) { this._name = name; this._possessions = []; this._possessions.push(new Thing()) this._possessions[100] = new Thing(); } } } 

你可以尝试这些。 他们不给我错误。

这也是从typescript数组声明的build议方法。

通过使用Array<Thing>它正在使用打字稿中的generics。 这与在C#代码中要求List<T>类似。

 // Declare with default value private _possessions: Array<Thing> = new Array<Thing>(); // or private _possessions: Array<Thing> = []; // or -> prefered by ts-lint private _possessions: Thing[] = []; 

要么

 // declare private _possessions: Array<Thing>; // or -> preferd by ts-lint private _possessions: Thing[]; constructor(){ //assign this._possessions = new Array<Thing>(); //or this._possessions = []; } 

翻译是正确的,expression的打字不是。 TypeScript错误地将expression式new Thing[100]作为数组input。 使用索引操作符来索引构造函数Thing应该是一个错误。 在C#中,这将分配一个由100个元素组成的数组。 在JavaScript中,这将调用Thing索引100处的值,就好像是一个构造函数。 由于这个值是undefined因此会引发你提到的错误。 在JavaScript和TypeScript中,您需要new Array(100)

您应该将此报告为CodePlex上的错误。