110 votes

Comment instancier, initialiser et remplir un tableau en TypeScript ?

J'ai les classes suivantes en TypeScript :

class bar {
    length: number;
}

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

Et puis je l'ai fait :

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

Existe-t-il un moyen de faire cela en TypeScript ?

UPDATE

J'ai trouvé une autre solution en ayant une méthode set qui se retourne elle-même :

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

vous pouvez donc l'initialiser comme ci-dessous :

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

86voto

Ryan Cavanaugh Points 17393

Il n'existe pas de syntaxe d'initialisation de champ comme celle des objets en JavaScript ou TypeScript.

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

28voto

orad Points 978

Si vous voulez vraiment avoir des paramètres nommés et que vos objets soient des instances de votre classe, vous pouvez faire ce qui suit :

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

Aussi aquí C'est l'article en question sur la plateforme de suivi des problèmes de typescript.

15voto

user1417996 Points 157

Une solution simple pourrait être :

interface bar {
    length: number;
}

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

4voto

Liam Hogan Points 95

Si vous souhaitez "ajouter" des éléments supplémentaires à une page, vous pouvez créer un tableau de cartes. Voici comment j'ai créé un réseau de cartes et y a ajouté des résultats :

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 ressemble à...

export class Product {
    id: number;
    [...]
}

2voto

ArDumez Points 418

Une autre solution :

interface bar {
    length: number;
}

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X