Wie instanziiere, initialisiere und fülle ich ein Array in TypeScript?


77

Ich habe die folgenden Klassen in TypeScript:

class bar {
    length: number;
}

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

Und dann habe ich:

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

Gibt es eine Möglichkeit, dies in TypeScript zu tun?

AKTUALISIEREN

Ich habe eine andere Lösung gefunden, indem ich eine festgelegte Methode hatte, um sich selbst zurückzugeben:

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

Sie können es also wie folgt initialisieren:

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

Es wäre sehr nützlich, Objektinitialisierer in TypeScript zu haben, die C # ähneln. [ {length: 1} ]ist keine Instanz von bar, aber wenn unterstützt, new bar() { length = 1 }wäre es eine Instanz von bar. Vielleicht sollten wir dafür einen Funktionsvorschlag machen?
— Orad

Antworten:


66

Für Objekte in JavaScript oder TypeScript gibt es keine solche Feldinitialisierungssyntax.

Option 1:

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

bars = [ new bar(1) ];

Option 2:

interface bar {
    length: number;
}

bars = [ {length: 1} ];

8
um die Dinge klarer und typsicherer zu machen:bars:bar[]=[{length:1}]
— Patrice

Gibt es eine Möglichkeit, dies zu tun, ohne Klassen zu definieren?
— Blackiii

1
Die Frage ist, wie ein Array in einer Klasse initialisiert wird. Es gibt keine Möglichkeit, ein Array in einer Klasse ohne Verwendung von Klassen zu initialisieren.
— Ryan Cavanaugh

20

Wenn Sie wirklich benannte Parameter haben möchten und Ihre Objekte Instanzen Ihrer Klasse sein sollen, können Sie Folgendes tun:

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

Auch hier ist der verwandte Artikel zum Typoskript-Issue-Tracker.


+1 für Issue Link. Sie können Initialisierungswerte auch optional machen: options? : {length?: number; height?: number;}
— Cryptix Master

7

Eine einfache Lösung könnte sein:

interface bar {
    length: number;
}

let bars: bar[];
bars = [];

1

Eine andere Lösung:

interface bar {
    length: number;
}

bars = [{
  length: 1
} as bar];

0

Wenn Sie einer Seite zusätzliche Elemente hinzufügen möchten, möchten Sie möglicherweise ein Array von Karten erstellen. So habe ich ein Array von Karten erstellt und dann Ergebnisse hinzugefügt:

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

});

Wo product.ts aussehen ...

export class Product {
    id: number;
    [...]
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.