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)
    ]);
Ray Cheng
quelle
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} ];
Ryan Cavanaugh
quelle
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.

orad
quelle
+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 = [];
Adel Bachene
quelle
1

Eine andere Lösung:

interface bar {
    length: number;
}

bars = [{
  length: 1
} as bar];
ArDumez
quelle
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;
    [...]
}
Liam Hogan
quelle