Jaka jest różnica w maszynopisie między export
i default export
. We wszystkich samouczkach widzę osoby uczestniczące w export
zajęciach i nie mogę skompilować kodu, jeśli nie dodam default
słowa kluczowego przed eksportem.
Poza tym nie mogłem znaleźć śladu domyślnego słowa kluczowego eksportu w oficjalnej dokumentacji maszynopisu .
export class MyClass {
collection = [1,2,3];
}
Nie kompiluje się. Ale:
export default class MyClass {
collection = [1,2,3];
}
Robi.
Błąd jest następujący: error TS1192: Module '"src/app/MyClass"' has no default export.
typescript
ecmascript-6
fos.alex
źródło
źródło
Odpowiedzi:
Domyślny eksport (
export default
)Główną różnicą jest to, że możesz mieć tylko jeden domyślny eksport na plik i importujesz go w następujący sposób:
Możesz nadać mu dowolną nazwę. Na przykład działa to dobrze:
Nazwany eksport (
export
)Gdy używasz nazwanego eksportu, możesz mieć wiele eksportów na plik i musisz zaimportować eksport otoczony nawiasami klamrowymi:
Uwaga: Dodanie nawiasów naprawi błąd opisany w pytaniu, a nazwa określona w nawiasach klamrowych musi pasować do nazwy eksportu.
Lub powiedzmy, że Twój plik wyeksportował wiele klas, a następnie możesz zaimportować obie:
Lub możesz nadać jednemu z nich inną nazwę w tym pliku:
Lub możesz zaimportować wszystko, co jest eksportowane, używając
* as
:Którego użyć?
W ES6 domyślny eksport jest zwięzły, ponieważ ich przypadek użycia jest częstszy ; jednak, gdy pracuję nad kodem wewnętrznym projektu w TypeScript, prawie przez cały czas wolę używać nazwanego eksportu zamiast domyślnego eksportu, ponieważ działa bardzo dobrze przy refaktoryzacji kodu. Na przykład, jeśli domyślnie wyeksportujesz klasę i zmienisz jej nazwę, zmieni ona tylko nazwę klasy w tym pliku, a nie inne odniesienia w innych plikach. Dzięki nazwanym eksportom zmieni nazwę klasy i wszystkie odwołania do tej klasy we wszystkich innych plikach.
Bardzo dobrze gra również z plikami beczkowymi (pliki, które używają
export *
eksportu przestrzeni nazw - —w celu eksportu innych plików). Przykład tego pokazano w sekcji „przykład” tej odpowiedzi .Zauważ, że moja opinia na temat korzystania z nazwanych eksportów, nawet jeśli istnieje tylko jeden eksport, jest sprzeczna z Podręcznikiem TypeScript - patrz sekcja „Czerwone flagi”. Uważam, że to zalecenie ma zastosowanie tylko wtedy, gdy tworzysz interfejs API dla innych osób, a kod nie jest wewnętrzny dla twojego projektu. Kiedy projektuję interfejs API dla ludzi, użyję domyślnego eksportu, aby ludzie mogli to zrobić
import myLibraryDefaultExport from "my-library-name";
. Jeśli nie zgadzasz się ze mną, chciałbym usłyszeć twoje uzasadnienie.To powiedziawszy, znajdź to, co wolisz! Możesz użyć jednego, drugiego lub obu jednocześnie.
Dodatkowe punkty
Domyślny eksport jest tak naprawdę nazwanym eksportem o nazwie
default
, więc jeśli plik ma domyślny eksport, możesz również zaimportować, wykonując:I zwróć uwagę, że istnieją inne sposoby importowania:
źródło
import myAlias = require("./PathToFile")
i posiadająceexport = IInterfaceOrClass
w pliku? Czy to już staroświecki?default
czy w tym pliku będzie nadal dostępny domyślny eksport? jeśli tak, jakie są zasady.Próbowałem rozwiązać ten sam problem, ale znalazłem interesującą radę Basarata Ali Syeda dotyczącą sławy TypeScript Deep Dive , że powinniśmy unikać ogólnej
export default
deklaracji dla klasy, a zamiast tego dołączyćexport
tag do deklaracji klasy. Zaimportowana klasa powinna być zamiast tego wymieniona wimport
poleceniu modułu.To znaczy: zamiast
i prosty
import Foo from './foo';
w module, który zaimportuje, należy użyći
import {Foo} from './foo'
u importera.Powodem tego są trudności w refaktoryzacji klas i dodatkowa praca na eksport. Oryginalny post Basatara jest w,
export default
może prowadzić do problemówźródło
Oto przykład z prostym eksportem obiektów.
W głównym pliku (użyj, gdy nie chcesz i nie musisz tworzyć nowego wystąpienia) i nie jest to globalne, zaimportujesz to tylko wtedy, gdy będzie to potrzebne:
źródło