interfaceest pour quand vous voulez simplement décrire la forme d'un objet. Il n'y a jamais de génération de code pour les interfaces - elles sont uniquement un artefact dans le système de types. Vous ne verrez aucune différence dans la génération de code pour une classe selon qu'elle contient ou non une implementsclause.
declare classest lorsque vous souhaitez décrire une classe existante (généralement une classe TypeScript, mais pas toujours) qui va être présente en externe (par exemple, vous avez deux fichiers .ts qui se compilent en deux fichiers .js et les deux sont inclus via des scriptbalises dans une page Web). Si vous héritez d'une classutilisation extends(indépendamment du fait que le type de base soit a declare classou normal class), le compilateur va générer tout le code pour connecter la chaîne de prototypes et les constructeurs de transfert et autres.
Si vous essayez d'hériter d' declare classune interface qui aurait dû être une interface, vous allez avoir une erreur d'exécution car ce code généré fera référence à un objet sans manifestation d'exécution.
Inversement, si vous êtes simplement implementune interface qui aurait dû être a declare class, vous allez devoir réimplémenter tous les membres vous-même et ne profiterez pas de la réutilisation du code de la classe de base potentielle et des fonctions qui vérifie la chaîne de prototypes lors de l'exécution rejettera votre objet comme n'étant pas réellement une instance de la classe de base.
Pour devenir vraiment ringard, si vous avez un arrière-plan C ++, vous pouvez à peu près considérer interfacecomme typedefet declare classcomme une externdé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 interfaceet declare classest que vous ne pouvez pas newune interface. Cependant, si vous avez l'intention de extend/ l' implementun de ces types dans un nouveau class, vous devez absolument avoir choisi correctement entre interfaceet 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 de constructeur (quelque chose d'invocable avec
new) qui est réellement présente à l'exécution (par exemple Date, mais JQueryStaticn'est pas)? Si non , tu veux vraimentinterface
- Ai-je affaire à une classe compilée à partir d'un autre fichier TypeScript ou à quelque chose de suffisamment similaire? Si oui , utilisez
declare class