Як створити екземпляр, ініціалізувати та заповнити масив у TypeScript?


80

У мене є такі класи в TypeScript:

class bar {
    length: number;
}

class foo {
    bars: bar[] = new Array();
}

І тоді я маю:

var ham = new foo();
ham.bars = [
    new bar() {          // <-- compiler says Expected "]" and Expected ";"
        length = 1
    }
];

Чи є спосіб зробити це в TypeScript?

ОНОВЛЕННЯ

Я придумав інше рішення, маючи встановлений метод повернути себе:

class bar {
    length: number;

    private ht: number;
    height(h: number): bar {
        this.ht = h; return this;
    }

    constructor(len: number) {
        this.length = len;
    }
}

class foo {
    bars: bar[] = new Array();
    setBars(items: bar[]) {
        this.bars = items;
        return this;
    }
}

так що ви можете ініціалізувати його, як показано нижче:

var ham = new foo();
ham.setBars(
    [
        new bar(1).height(2),
        new bar(3)
    ]);

Було б дуже корисно мати ініціалізатори об’єктів у TypeScript, подібні до C #. [ {length: 1} ]не є екземпляром bar, але якщо підтримується, new bar() { length = 1 }буде екземпляром bar. Може, нам слід зробити для цього пропозицію функції?
орад

Відповіді:


68

Не існує такого синтаксису ініціалізації поля, як такий для об’єктів у JavaScript або TypeScript.

Варіант 1:

class bar {
    // Makes a public field called 'length'
    constructor(public length: number) { }
}

bars = [ new bar(1) ];

Варіант 2:

interface bar {
    length: number;
}

bars = [ {length: 1} ];

8
щоб зробити речі зрозумілішими та безпечнішими:bars:bar[]=[{length:1}]
Патріс

Чи є спосіб зробити це без визначення класів?
Li Zhang

1
Питання в тому, як ініціалізувати масив у класі. Немає способу ініціалізувати масив у класі без використання класів.
Райан Кавано,

20

Якщо ви дійсно хочете мати іменовані параметри, а об'єкти мають бути екземплярами вашого класу, ви можете зробити наступне:

class bar {
    constructor (options?: {length: number; height: number;}) {
        if (options) {
            this.length = options.length;
            this.height = options.height;
        }
    }
    length: number;
    height: number;
}

class foo {
    bars: bar[] = new Array();
}

var ham = new foo();
ham.bars = [
    new bar({length: 4, height: 2}),
    new bar({length: 1, height: 3})
];

Також ось відповідний пункт про відстежувач випусків машинопису.


+1 за посилання на випуск. Ви також можете зробити значення ініціалізатора необов’язковими: options? : {length?: number; height?: number;}
Cryptix Master



0

Якщо ви хочете «додати» додаткові елементи на сторінку, ви можете створити масив карт. Ось як я створив масив карт, а потім додав до нього результати:

import { Product } from '../models/product';

products: Array<Product>;          // Initialize the array.

[...]

let i = 0;
this.service.products( i , (result) => {

    if ( i == 0 ) {
        // Create the first element of the array.
        this.products = Array(result);
    } else { 
        // Add to the array of maps.
        this.products.push(result);
    }

});

Де product.ts виглядає як ...

export class Product {
    id: number;
    [...]
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.