TypeScript использование типизированного массива
У меня есть определение класса 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 ": объект имеет значение null или undefined".
Если я изменил тип _possession на any[]
и инициализировал _possession с new Array()
исключение не выбрасывалось. Я что-то пропустил?
Ответы
Ответ 1
В вашем синтаксисе есть ошибка:
this._possessions = new Thing[100]();
Это не создает "массив вещей". Чтобы создать массив вещей, вы можете просто использовать выражение литерала массива:
this._possessions = [];
Из конструктора массива, если вы хотите установить длину:
this._possessions = new Array(100);
Я создал краткий рабочий пример, который вы можете попробовать в playground.
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();
}
}
}
Ответ 2
Вы можете попробовать любой из них. Они не дают мне ошибок.
Это также предложенный метод из typescript для объявления массива.
Используя Array<Thing>
, он использует дженерики в typescript. Это похоже на запрос 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 = [];
}
Ответ 3
Перевод верен, набрав выражение, нет. TypeScript неверно вводит выражение new Thing[100]
как массив. Ошибка индексации Thing
, функции-конструктора, с помощью оператора индекса. В С# это выделит массив из 100 элементов. В JavaScript это вызывает значение в индексе 100 Thing
, как если бы был конструктором. Поскольку эти значения undefined
, он вызывает указанную вами ошибку. В JavaScript и TypeScript вместо этого вы хотите new Array(100)
.
Вы должны сообщить об этом как об ошибке в CodePlex.