Was ist der Unterschied in Typescript zwischen export
und default export
. In allen Tutorials sehe ich Leute in export
ihren Klassen und ich kann meinen Code nicht kompilieren, wenn ich das default
Schlüsselwort vor dem Export nicht hinzufüge .
Außerdem konnte ich in der offiziellen Typoskript-Dokumentation keine Spur des Standardexport-Schlüsselworts finden .
export class MyClass {
collection = [1,2,3];
}
Kompiliert nicht. Aber:
export default class MyClass {
collection = [1,2,3];
}
Tut.
Der Fehler ist: error TS1192: Module '"src/app/MyClass"' has no default export.
typescript
ecmascript-6
fos.alex
quelle
quelle
Antworten:
Standardexport (
export default
)Der Hauptunterschied besteht darin, dass Sie nur einen Standardexport pro Datei haben können und diesen wie folgt importieren:
Sie können ihm einen beliebigen Namen geben. Zum Beispiel funktioniert das gut:
Benannter Export (
export
)Wenn Sie einen benannten Export verwenden, können Sie mehrere Exporte pro Datei durchführen und die Exporte in geschweiften Klammern importieren:
Hinweis: Durch Hinzufügen der geschweiften Klammern wird der Fehler behoben, den Sie in Ihrer Frage beschreiben, und der in den geschweiften Klammern angegebene Name muss mit dem Namen des Exports übereinstimmen.
Oder sagen Sie, Ihre Datei hat mehrere Klassen exportiert , dann können Sie beide wie folgt importieren:
Oder Sie können einem von ihnen in dieser Datei einen anderen Namen geben:
Oder Sie können alles, was exportiert wird, importieren, indem Sie Folgendes verwenden
* as
:Welche verwenden?
In ES6 sind Standardexporte präzise, da ihr Anwendungsfall häufiger vorkommt . Wenn ich jedoch an projektinternem Code in TypeScript arbeite, bevorzuge ich fast immer benannte Exporte anstelle von Standardexporten, da dies sehr gut mit Code-Refactoring funktioniert. Wenn Sie beispielsweise standardmäßig eine Klasse exportieren und diese Klasse umbenennen, wird nur die Klasse in dieser Datei umbenannt und keine der anderen Referenzen in anderen Dateien. Bei benannten Exporten werden die Klasse und alle Verweise auf diese Klasse in allen anderen Dateien umbenannt.
Es spielt sich auch sehr gut mit Barrel-Dateien (Dateien, die Namespace-Exporte verwenden
export *
- um andere Dateien zu exportieren). Ein Beispiel hierfür finden Sie im Abschnitt "Beispiel" dieser Antwort .Beachten Sie, dass meine Meinung zur Verwendung benannter Exporte, auch wenn es nur einen Export gibt, im Widerspruch zum TypeScript-Handbuch steht - siehe Abschnitt "Rote Flaggen". Ich glaube, diese Empfehlung gilt nur, wenn Sie eine API für andere Personen erstellen und der Code nicht projektintern ist. Wenn ich eine API für Benutzer entwerfe, verwende ich einen Standardexport, damit Benutzer dies tun können
import myLibraryDefaultExport from "my-library-name";
. Wenn Sie mir diesbezüglich nicht zustimmen, würde ich gerne Ihre Argumentation hören.Das heißt, finden Sie, was Sie bevorzugen! Sie können das eine, das andere oder beide gleichzeitig verwenden.
Zusätzliche Punkte
Ein Standardexport ist eigentlich ein benannter Export mit dem Namen
default
. Wenn die Datei also einen Standardexport hat, können Sie auch Folgendes importieren:Beachten Sie auch, dass es folgende andere Importmöglichkeiten gibt:
quelle
import myAlias = require("./PathToFile")
undexport = IInterfaceOrClass
in der Datei passiert ? Ist das jetzt altmodisch?default
eingeben, ist in dieser Datei immer noch ein Standardexport verfügbar? Wenn ja, wie lauten die Regeln?Ich habe versucht, das gleiche Problem zu lösen, fand aber einen interessanten Rat von Basarat Ali Syed von TypeScript Deep Dive , dass wir die generische
export default
Deklaration für eine Klasse vermeiden und stattdessen dasexport
Tag an die Klassendeklaration anhängen sollten . Die importierte Klasse sollte stattdessen imimport
Befehl des Moduls aufgeführt werden.Das heißt: statt
und das einfache
import Foo from './foo';
in dem Modul, das importiert werden soll, sollte man verwendenund
import {Foo} from './foo'
im Importeur.Der Grund dafür sind Schwierigkeiten bei der Umgestaltung von Klassen und die zusätzliche Arbeit für den Export. Der ursprüngliche Beitrag von Basarat
export default
kann zu Problemen führenquelle
Hier ist ein Beispiel für den einfachen Objektexport.
In der Hauptdatei (Verwenden Sie diese Option, wenn Sie keine neue Instanz erstellen möchten und müssen) und wenn diese nicht global ist, wird sie nur dann importiert, wenn sie benötigt wird:
quelle