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上的错误。