Quand utiliser l'interface et le modèle dans TypeScript / Angular2

197

J'ai récemment regardé un tutoriel sur Angular 2 avec TypeScript, mais je ne sais pas quand utiliser une interface et quand utiliser un modèle pour contenir des structures de données.

Exemple d'interface:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

Exemple de modèle:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

Je veux charger des données JSON à partir d'une URL et me lier à l'interface / au modèle. Parfois, je veux un seul objet de données, d'autres fois je veux tenir et tableau de l'objet.

Lequel dois-je utiliser et pourquoi?

I_LIKE_FOO
la source
13
Utilisez une classe lorsque vous avez besoin d'une init de logique personnalisée, sinon utilisez toujours une interface car elle n'est disponible qu'au moment de la compilation. Une interface dactylographiée n'est pas compilée en javascript car elle n'existe pas en javascript.
Dieterg
6
Gardez à l'esprit que les interfaces ne fonctionneront PAS avec l'injection de dépendances dans Angular 2. Ici, vous devrez utiliser des classes.
jlang

Réponses:

137

Les interfaces sont uniquement au moment de la compilation. Cela vous permet uniquement de vérifier que les données attendues reçues suivent une structure particulière. Pour cela, vous pouvez diffuser votre contenu sur cette interface:

this.http.get('...')
    .map(res => <Product[]>res.json());

Voir ces questions:

Vous pouvez faire quelque chose de similaire avec la classe, mais les principales différences avec la classe sont qu'elles sont présentes au moment de l'exécution (fonction constructeur) et vous pouvez y définir des méthodes avec traitement. Mais, dans ce cas, vous devez instancier des objets pour pouvoir les utiliser:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });
Thierry Templier
la source
27
Merci pour votre réponse détaillée. Si l'interface n'est utilisée qu'au moment de la compilation, comment le compilateur peut-il vérifier la structure du fichier JSON sans réellement examiner le http get? Si ce n'est pas le cas, à quoi bon même s'embêter avec une interface?
I_LIKE_FOO
7
@I_LIKE_FOO, le compilateur n'a pas besoin d'examiner l'appel get. Il ne se soucie que de vérifier les types qu'il connaît et qu'ils sont correctement alignés. var data = res.json();est vraiment var data: any = res.json();pour le compilateur donc nous perdons tout type de vérification data. Quel serait plus utile ici serait quelque chose comme var data: ProductDto[] = res.json();avec ProductDtoêtre une interface qui modélise la structure de données dans le JSON retourné.
GFoley83
3
Plus: Angular style guide says not to use interfaces.Always use classes.Voir angular.io/guide/styleguide#style-03-03
Sampath
4
Oui, mais le problème est qu'ils ne sont pas les dieux gourous qui ont conçu Typescript. Ce serait Microsoft et la société. Ils ont tendance à privilégier les interfaces et les classes le cas échéant. Aussi des points bonus ... l'un est à l'exécution et l'autre est au moment de la compilation
Tom Stickel
11
@Sampath Le guide de style angulaire a peut-être été mis à jour car je vois maintenant ceci "Envisagez d'utiliser une interface pour les modèles de données.". Implique une interface préférée à une classe pour les modèles de données.
Mikezx6r
40

L' interface décrit soit un contrat pour une classe, soit un nouveau type . Il s'agit d'un élément typographique pur, il n'affecte donc pas Javascript.

Un modèle, et notamment une classe , est une fonction JS réelle qui est utilisée pour générer de nouveaux objets.

Je veux charger des données JSON à partir d'une URL et me lier à l'interface / au modèle.

Optez pour un modèle, sinon ce sera toujours JSON dans votre Javascript.

pietro909
la source
4

Comme @ThierryTemplier l'a dit pour recevoir des données du serveur et également transmettre le modèle entre les composants (pour garder la liste intellisense et faire une erreur de conception), il est bon d'utiliser l'interface mais je pense que pour envoyer des données au serveur (DTO), il est préférable d'utiliser la classe pour prendre avantages de la cartographie automatique DTO du modèle.

M_Farahmand
la source
-22

Utiliser la classe au lieu de l'interface, c'est ce que j'ai découvert après toutes mes recherches.

Pourquoi? Une classe seule est moins de code qu'une interface classe plus. (de toute façon, vous pouvez avoir besoin d'une classe pour le modèle de données)

Pourquoi? Une classe peut agir comme une interface (utilisez des implémentations plutôt que des extensions).

Pourquoi? Une classe d'interface peut être un jeton de recherche de fournisseur dans l'injection de dépendance angulaire.

de Angular Style Guide

Fondamentalement, une classe peut tout faire, ce que fera une interface. Il se peut donc que vous n'ayez jamais besoin d'utiliser une interface .

Sajith Mantharath
la source
10
Le Guide de style angulaire dit actuellement: « Envisagez d'utiliser une interface pour les modèles de données.
Alex Peters
@AlexPeters Veuillez fournir un lien authentique. Merci d'avance
Anand Phadke
@AnandPhadke bien sûr, voici un lien Wayback Machine vers le guide de style angulaire à peu près au moment de mon commentaire ci-dessus.
Alex Peters