133 votes

Quelle est la différence entre "declare class" et "interface" en TypeScript ?

En TypeScript, lors de la création de fichiers de déclaration source .d.ts, lequel est préférable et pourquoi ?

declare class Example {
    public Method(): void; 
}

ou

interface Example {
    Method(): void;
}

Les différences que je peux voir sont que les interfaces ne peuvent pas avoir de méthodes statiques, donc vous devez utiliser une classe pour cela. Les deux ne produisent pas de sortie JS, donc peut-être que cela n'a pas d'importance ?

181voto

Ryan Cavanaugh Points 17393

interface est destiné aux cas où vous souhaitez simplement décrire la forme d'un objet. Il n'y a pas de génération de code, jamais, pour les interfaces -- elles sont uniquement un artefact dans le système de type. Vous ne verrez aucune différence dans la génération de code pour une classe selon qu'elle possède ou non une interface. implements clause.

declare class est utilisé lorsque vous souhaitez décrire une existant (généralement une classe TypeScript, mais pas toujours) qui sera présente à l'extérieur (par exemple, vous avez deux fichiers .ts qui sont compilés en deux fichiers .js et les deux sont inclus par l'intermédiaire de script dans une page web). Si vous héritez d'un class en utilisant extends (indépendamment du fait que le type de base soit un declare class ou une class ), le compilateur va générer tout le code permettant d'accrocher la chaîne de prototypes et de transmettre les constructeurs, etc.

Si vous essayez d'hériter d'un declare class qui aurait dû être une interface, vous allez avoir une erreur d'exécution car le code généré fera référence à un objet sans manifestation d'exécution.

À l'inverse, si vous vous contentez implement une interface qui aurait dû être une declare class En effet, vous devrez réimplémenter tous les membres vous-même et vous ne profiterez pas de la réutilisation du code de la classe de base. De plus, les fonctions qui vérifient la chaîne de prototypes au moment de l'exécution rejetteront votre objet comme n'étant pas une instance de la classe de base.

Pour être vraiment ringard, si vous avez des connaissances en C++, vous pouvez penser en gros à interface comme typedef y declare class comme un extern déclaration d'un constructeur qui manque strictement de définition dans cette unité de compilation.

Du point de vue de la consommation pure (écriture de code impératif, pas d'ajout de nouveaux types), la seule différence entre interface y declare class c'est que vous ne pouvez pas new une interface. Cependant, si vous avez l'intention de extend / implement un de ces types dans une nouvelle class vous devez absolument avoir choisi correctement entre interface y declare class . Un seul d'entre eux fonctionnera.

Deux règles qui vous serviront bien :

  • Le nom du type s'aligne-t-il sur une fonction constructrice (quelque chose d'invocable avec new ) qui est réellement présent au moment de l'exécution (par exemple Date est, mais JQueryStatic n'est pas) ? Si no vous voulez certainement interface
  • Suis-je en train de traiter une classe compilée à partir d'un autre fichier TypeScript, ou quelque chose de suffisamment similaire ? Si oui utiliser declare class

29voto

Steve Fenton Points 55265

Vous pouvez implémenter l'interface :

class MyClass implements Example {
    Method() {

    }
}

Considérant que le declare class est en réalité destinée à être utilisée pour ajouter des définitions de type pour du code externe qui n'est pas écrit en TypeScript - l'implémentation est donc "ailleurs".

15voto

nikk wong Points 3124

En termes simples, declare est utilisé dans .ts / d.ts pour indiquer au compilateur que nous devons nous attendre à ce que le mot clé que nous declaring pour exister dans cet environnement, même s'il n'est pas défini dans le présent fichier. Cela nous permettra d'avoir une sécurité de type lors de l'utilisation de l'objet déclaré, car le compilateur Typescript sait maintenant qu'un autre composant peut fournir cette variable.

7voto

Différence entre declare y interface dans TS :

déclarer :

declare class Example {
    public Method(): void; 
}

Dans le code ci-dessus declare permet au compilateur TS de savoir que quelque part la classe Example est déclaré. Cela ne signifie pas que la classe est incluse par magie. En tant que programmeur, vous êtes responsable de la disponibilité de la classe au moment où vous la déclarez (avec l'attribut declare mot-clé).

interface :

interface Example {
    Method(): void;
}

Un site interface est une construction virtuelle qui n'existe qu'au sein de typescript. Le compilateur typescript l'utilise dans le seul but de vérifier le type. Lorsque le code est compilé en javascript, cette construction est supprimée. Le compilateur typescript utilise les interfaces afin de vérifier si les objets ont la bonne structure.

Par exemple, lorsque nous avons l'interface suivante :

interface test {
  foo: number,
  bar: string,
}

Les objets que nous définissons et qui ont ce type d'interface doivent correspondre exactement à l'interface :

// perfect match has all the properties with the right types, TS compiler will not complain.
  const obj1: test = {   
    foo: 5,
    bar: 'hey',
  }

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