Машинописный текст набирается использования массива
у меня есть определение класса 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];
}
похоже, что массив типа Thing не переводится правильно в соответствующий тип массива Javascript. Это фрагмент из сгенерированного JavaScript:
function Person(name) {
this._name = name;
this._possessions = new Entities.Thing[100]();
}
выполнение кода, содержащего объект Person, вызывает исключение при попытке инициализации поля _possession:
ошибка " 0x800a138f-ошибка выполнения Microsoft JScript: не удается получить значение свойства '100': object is null or undefined".
если я изменю тип _possession на any[]
и инициализировать _possession с new Array()
исключение не выдается. Я что-то пропустил?
3 ответа:
у вас есть ошибка в синтаксисе здесь:
this._possessions = new Thing[100]();
это не создает "такие вещи". Чтобы создать массив вещей, вы можете просто использовать литеральное выражение массива:
this._possessions = [];
конструктора массива, если вы хотите установить длину:
this._possessions = new Array(100);
Я создал краткий рабочий пример, который вы можете попробовать в детская площадка.
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 для объявления массива.
С помощью
Array<Thing>
он использует дженерики в typescript. Это похоже на проситьList<T>
в коде c#.// 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 = []; }
перевод правильный, типизация выражения нет. TypeScript неправильно набирает выражение
new Thing[100]
как массив. Это должна быть ошибка для индексированияThing
, функция-конструктор, использующая оператор index. В C# это выделит массив из 100 элементов. В JavaScript это вызывает значение с индексом 100Thing
как будто был конструктор. Так как это значенияundefined
вызывает ошибку, которую вы упомянули. В JavaScript и TypeScript вы хотитеnew Array(100)
вместо.вы должны сообщить об этом как об ошибке на сайте CodePlex.