interfaceist für den Fall, dass Sie einfach die Form eines Objekts beschreiben möchten. Es gibt niemals eine Codegenerierung für Schnittstellen - sie sind nur ein Artefakt im Typsystem. Sie werden keinen Unterschied in der Codegenerierung für eine Klasse sehen, abhängig davon, ob sie eine implementsKlausel enthält oder nicht .
declare classDies ist der Fall, wenn Sie eine vorhandene Klasse beschreiben möchten (normalerweise eine TypeScript-Klasse, aber nicht immer), die extern vorhanden sein wird (z. B. haben Sie zwei .ts-Dateien, die zu zwei .js-Dateien kompiliert werden, und beide werden über scriptTags eingeschlossen auf einer Webseite). Wenn Sie von einer classVerwendung erben extends(unabhängig davon, ob der Basistyp declare classein regulärer oder ein regulärer Typ war class), generiert der Compiler den gesamten Code, um die Prototypkette und die Weiterleitungskonstruktoren anzuschließen, und was nicht.
Wenn Sie versuchen, von declare classeiner Schnittstelle zu erben , die eine Schnittstelle sein sollte, tritt ein Laufzeitfehler auf, da dieser generierte Code auf ein Objekt ohne Laufzeitmanifestation verweist.
Umgekehrt, wenn Sie einfach implementeine Schnittstelle sind, die eine sein sollte declare class, müssen Sie alle Mitglieder selbst neu implementieren und werden keine Code-Wiederverwendung aus der potenziellen Basisklasse und den Funktionen nutzen Wenn Sie die Prototypenkette zur Laufzeit überprüfen, wird Ihr Objekt als keine Instanz der Basisklasse zurückgewiesen.
Um wirklich nerdig zu werden, wenn Sie einen C ++ - Hintergrund haben, können Sie sich grob interfaceals typedefund declare classals externDeklaration eines Konstruktors vorstellen, dem in dieser Kompilierungseinheit strikt eine Definition fehlt.
Von der reinen Verbraucherseite (Schreiben von imperativem Code, keine neuen Typen hinzufügen) besteht der einzige Unterschied zwischen interfaceund declare classdarin, dass Sie keine newSchnittstelle verwenden können. Wenn Sie jedoch beabsichtigen , extend/ implementeinen dieser Typen in einem neuen class, Sie haben absolut gewählt haben richtig zwischen interfaceund declare class. Nur einer von ihnen wird funktionieren.
Zwei Regeln, die Ihnen gut dienen:
- Stimmt der Name des Typs mit einer Konstruktorfunktion überein (etwas, mit dem aufgerufen werden kann
new), das zur Laufzeit tatsächlich vorhanden ist (z. B. Dateist, aber JQueryStaticnicht)? Wenn nein , möchten Sie auf jeden Fallinterface
- Handle es sich um eine kompilierte Klasse aus einer anderen TypeScript-Datei oder um etwas ähnlich Ähnliches? Wenn ja , verwenden Sie
declare class