Машинописный текст набирается использования массива


у меня есть определение класса 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 92

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 это вызывает значение с индексом 100 Thing как будто был конструктор. Так как это значения undefined вызывает ошибку, которую вы упомянули. В JavaScript и TypeScript вы хотите new Array(100) вместо.

вы должны сообщить об этом как об ошибке на сайте CodePlex.