Was ist in TypeScript beim Erstellen von .d.ts-Quelldeklarationsdateien vorzuziehen und warum?
declare class Example {
public Method(): void;
}
oder
interface Example {
Method(): void;
}
Die Unterschiede, die ich feststellen kann, sind, dass Schnittstellen keine statischen Methoden haben können, daher müssen Sie dafür eine Klasse verwenden. Beide produzieren keine JS-Ausgabe, also spielt es vielleicht keine Rolle?
javascript
typescript
Chris
quelle
quelle
Antworten:
interface
ist 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 eineimplements
Klausel enthält oder nicht .declare class
Dies 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 überscript
Tags eingeschlossen auf einer Webseite). Wenn Sie von einerclass
Verwendung erbenextends
(unabhängig davon, ob der Basistypdeclare class
ein regulärer oder ein regulärer Typ warclass
), generiert der Compiler den gesamten Code, um die Prototypkette und die Weiterleitungskonstruktoren anzuschließen, und was nicht.Wenn Sie versuchen, von
declare class
einer 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
implement
eine Schnittstelle sind, die eine sein solltedeclare 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
interface
alstypedef
unddeclare class
alsextern
Deklaration 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
interface
unddeclare class
darin, dass Sie keinenew
Schnittstelle verwenden können. Wenn Sie jedoch beabsichtigen ,extend
/implement
einen dieser Typen in einem neuenclass
, Sie haben absolut gewählt haben richtig zwischeninterface
unddeclare class
. Nur einer von ihnen wird funktionieren.Zwei Regeln, die Ihnen gut dienen:
new
), das zur Laufzeit tatsächlich vorhanden ist (z. B.Date
ist, aberJQueryStatic
nicht)? Wenn nein , möchten Sie auf jeden Fallinterface
declare class
quelle
new
Operator für einen Schnittstellentyp nicht aufrufen . Schnittstellen können jedoch Konstruktsignaturen haben, dh Sie können dennew
Operator für einen Wert des Schnittstellentyps aufrufen . Dies unterscheidet sich stark von der Funktionsweiseclass
, bei der sich die Konstruktsignatur auf dem Typnamen selbst und nicht auf einem Ausdruck dieses Typs befindet.Sie können die Schnittstelle implementieren:
Während die
declare class
Syntax eigentlich dazu gedacht ist, Typdefinitionen für externen Code hinzuzufügen, der nicht in TypeScript geschrieben ist, erfolgt die Implementierung "anderswo".quelle
In Laienbegriffen
declare
wird in.ts
/d.ts
files verwendet, um dem Compiler mitzuteilen, dass das zu erwartende Schlüsselwortdeclaring
in dieser Umgebung zu erwarten ist , auch wenn es in der vorliegenden Datei nicht definiert ist. Dies ermöglicht uns dann die Typensicherheit bei Verwendung des deklarierten Objekts, da der Typescript-Compiler jetzt weiß, dass eine andere Komponente diese Variable bereitstellen kann.quelle
Unterschied zwischen
declare
undinterface
in TS:erklären:
Im obigen Code teilt
declare
der TS-Compiler mit, dass die Klasse irgendwoExample
deklariert ist. Dies bedeutet nicht, dass die Klasse magisch eingeschlossen ist. Sie als Programmierer sind dafür verantwortlich, dass die Klasse verfügbar ist, wenn Sie sie deklarieren (mit demdeclare
Schlüsselwort).Schnittstelle:
An
interface
ist ein virtuelles Konstrukt, das nur innerhalb von Typoskript existiert. Der Typoskript-Compiler verwendet es ausschließlich zur Typprüfung. Wenn der Code in Javascript kompiliert wird, wird das gesamte Konstrukt entfernt. Der Typoskript-Compiler verwendet Schnittstellen, um zu überprüfen, ob Objekte die richtige Struktur haben.Zum Beispiel, wenn wir die folgende Schnittstelle haben:
Die Objekte, die wir definieren und die diesen Schnittstellentyp haben, müssen genau mit der Schnittstelle übereinstimmen:
quelle