51 votes

Comment initialiser un objet en TypeScript

J'ai une classe modèle simple

export interface Category {

  name: string;
  description: string;

}

Je dois déclarer et initialiser une variable dans un composant angulaire. J'ai essayé :

category: Category = {};

Erreur : {} n'est pas assignable à une catégorie

category: Category = new Category();

erreur : La catégorie fait référence à un type, mais elle est référencée comme valeur

Des suggestions ?

103voto

Ian MacDonald Points 1

Il existe plusieurs façons de résoudre ce problème, en fonction du résultat que vous souhaitez obtenir.

Méthode 1 : convertissez votre interface à un class

export class Category {
  name: string;
  description: string;
}
const category: Category = new Category();

Méthode 2 : Etendez votre interface en tant que class

export class CategoryObject implements Category {
}
const category: Category = new CategoryObject();

Méthode 3 : Spécifiez complètement votre objet, en faisant correspondre les éléments suivants interface

const category: Category = {
  name: 'My Category',
  description: 'My Description',
};

Méthode 4 : Rendre les propriétés facultatives

export interface Category {
  name?: string;
  description?: string;
}

const category: Category = {};

Méthode 5 : Changez le type de votre variable pour utiliser Partial<T>

export interface Category {
  name: string;
  description: string;
}

const category: Partial<Category> = {};

32voto

Vitor M. Barbosa Points 1156

Si vous ne voulez pas changer votre définition de interface a class vous pouvez aussi le faire :

let category = <Category>{ };

Sinon, vous pourriez suivre d'autres réponses et changer votre Category pour être une classe.

modifier : selon le commentaire de ruffin ci-dessous, si l'interface est

export interface ITiered { one: { two: { three: function (x) {...} } } } 

et vous essayez let x = {} as ITiered alors vous aurez une erreur lorsque vous appellerez quelque chose comme x.one.two.three()

1 votes

N'est-ce pas dangereux si l'interface n'est pas à un seul niveau et nullable comme celle de cet exemple ? C'est-à-dire que si l'interface est export interface ITiered { one: { two: { three: function (x) {...} } } } et vous essayez let x = {} as ITiered ne le ferait pas. x.one.two.three() exploser sans être défini two ? Je suppose que je devrais aller préparer un cas le plus simple... ;^)

2 votes

Ouais, ça explose. main.ts:11 ERROR TypeError : Impossible de lire la propriété 'two' d'undefined. Vous êtes prévenus. ;^D

1 votes

Bon à savoir, je vais ajouter cet avertissement à ma réponse :)

16voto

Serdar Points 597

Dans Typescript, si vous voulez utiliser l'initialisateur d'objet, vous devez définir toutes les propriétés dans la classe.

let category: Category = {
    name: '',
    description: ''
};

De cette façon, votre modèle peut encore rester une interface.

5voto

Jake Holzinger Points 2385

Votre objet littéral doit correspondre à l'interface. Puisque votre interface a deux propriétés obligatoires ( name y description ), ils doivent tous deux être déclarés lors de l'instanciation de l'objet.

const category: Category = {
    name: 'foo',
    description: 'bar'
};

Si vous ne pouvez pas construire l'objet entier en premier lieu, vous pouvez utiliser la fonction intégrée Partial pour construire l'objet.

const builder: Partial<Category> = {};
builder.name = 'foo';
builder.description = 'bar';

const category: Category = builder as Category;

5voto

user1983909 Points 11

Comme une classe C# :

export class Category {
    category: number = null;
    description: string = null;
    name: string = null;

  public constructor(init?: Partial<Category>) {
        Object.assign(this, init);
}
}

Maintenant, lorsque vous créez une nouvelle instance, tous les noms de champs sont disponibles et vides.

 const instance_of_category: Category = new Category();

maintenant vous avez un objet de classe emty avec tous les champs définis comme en c# :

instance_of_category{
    "category": null,
    "description": null,
    "name": null
}

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