Використання набраного масиву TypeScript


96

У мене є визначення класу 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 ": об'єкт нульовий або невизначений".

Якщо я зміню тип _possession на any[] та ініціалізую _possession, за new Array()винятком, не викидається. Я щось пропустив?

Відповіді:


120

У вас є помилка у вашому синтаксисі тут:

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();
        }
    }
}

2
він не фіксує довжину, а повинен попередньо розподілити масив
Себастьян

чому ви не можете зробити private _possessions: Thing[] : []; у визначенні класу?
SuperUberDuper

54

Ви можете спробувати будь-який із цих варіантів. Вони не видають мені помилок.

Це також запропонований метод із typecript для оголошення масиву .

За допомогою Array<Thing> це, використовується загальні засоби в машинописі. Це схоже на запит 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 = [];
}

3
Для попереднього розподілу розміру використовуйте new Array<Thing>(100).
Дуг Домені

1
Ви також можете використовувати ... <Thing> []
danday74

@ danday74 - Я оновив, щоб включити ваш метод, він використовується за замовчуванням при використанні ts-lint recomended / latest config.
Kieran

9

Переклад правильний, введення виразу - ні. TypeScript неправильно вводить вираз new Thing[100]як масив. Це має бути помилка індексувати Thing, конструкторську функцію, використовуючи оператор індексу. У C # це виділить масив із 100 елементів. У JavaScript це називає значення в індексі 100 Thingяк би конструктором. Оскільки це значення, undefinedце викликає згадану вами помилку. Натомість у JavaScript та TypeScript ви хочете new Array(100).

Ви повинні повідомити про це як про помилку CodePlex.


1
Я не хочу новий масив (100). Я хочу ввести масив Thing. Я не знаю, чи це помилка, чи просто моє неправильне тлумачення специфікації документа.
Klaus Nji
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.