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