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.