Apa perbedaan dalam Script antara export
dan default export
. Dalam semua tutorial saya melihat orang-orang export
mengambil kelas mereka dan saya tidak dapat mengkompilasi kode saya jika saya tidak menambahkan default
kata kunci sebelum mengekspor.
Juga, saya tidak dapat menemukan jejak kata kunci ekspor default di dokumentasi naskah resmi .
export class MyClass {
collection = [1,2,3];
}
Tidak dikompilasi. Tapi:
export default class MyClass {
collection = [1,2,3];
}
Apakah.
Kesalahannya adalah: error TS1192: Module '"src/app/MyClass"' has no default export.
typescript
ecmascript-6
fos.alex
sumber
sumber
Jawaban:
Ekspor Default (
export default
)Perbedaan utama adalah bahwa Anda hanya dapat memiliki satu ekspor default per file dan Anda mengimpornya seperti ini:
Anda bisa memberikannya nama apa saja yang Anda suka. Misalnya ini berfungsi dengan baik:
Ekspor Bernama (
export
)Saat Anda menggunakan ekspor bernama, Anda dapat memiliki beberapa ekspor per file dan Anda perlu mengimpor ekspor yang dikelilingi dalam kurung:
Catatan: Menambahkan kawat gigi akan memperbaiki kesalahan yang Anda gambarkan dalam pertanyaan Anda dan nama yang ditentukan dalam kawat gigi harus cocok dengan nama ekspor.
Atau katakan file Anda mengekspor beberapa kelas, maka Anda dapat mengimpor keduanya seperti:
Atau Anda dapat memberikan salah satu dari mereka nama yang berbeda di file ini:
Atau Anda dapat mengimpor semua yang diekspor dengan menggunakan
* as
:Yang mana untuk digunakan?
Dalam ES6, ekspor default ringkas karena use case mereka lebih umum ; Namun, ketika saya bekerja pada kode internal ke proyek di TypeScript, saya lebih suka menggunakan ekspor bernama daripada ekspor default hampir sepanjang waktu karena itu bekerja sangat baik dengan kode refactoring. Sebagai contoh, jika Anda secara default mengekspor kelas dan mengganti nama kelas itu, itu hanya akan mengubah nama kelas dalam file itu dan bukan salah satu dari referensi lain di file lain. Dengan ekspor bernama itu akan mengubah nama kelas dan semua referensi ke kelas itu di semua file lainnya.
Itu juga memainkan sangat baik dengan file barel (file yang menggunakan ekspor namespace
export *
- untuk mengekspor file lain) Contoh dari ini ditunjukkan di bagian "contoh" dari jawaban ini .Perhatikan bahwa pendapat saya tentang menggunakan ekspor bernama bahkan ketika hanya ada satu ekspor bertentangan dengan TypeScript Handbook - lihat bagian "Bendera Merah". Saya percaya rekomendasi ini hanya berlaku ketika Anda membuat API untuk digunakan orang lain dan kode tidak internal untuk proyek Anda. Saat saya merancang API untuk digunakan orang, saya akan menggunakan ekspor default sehingga orang dapat melakukannya
import myLibraryDefaultExport from "my-library-name";
. Jika Anda tidak setuju dengan saya tentang melakukan ini, saya akan senang mendengar alasan Anda.Yang mengatakan, cari apa yang Anda inginkan! Anda bisa menggunakan satu, yang lain, atau keduanya sekaligus.
Poin Tambahan
Ekspor default sebenarnya adalah ekspor bernama dengan nama
default
, jadi jika file memiliki ekspor default maka Anda juga dapat mengimpor dengan melakukan:Dan perhatikan cara-cara lain untuk mengimpor ini:
sumber
import myAlias = require("./PathToFile")
dan yang adaexport = IInterfaceOrClass
dalam file? Apakah itu kuno sekarang?default
apakah masih akan ada ekspor default yang tersedia di file itu? jika demikian apa aturannya.Saya mencoba untuk memecahkan masalah yang sama, tetapi menemukan saran yang menarik oleh Basarat Ali Syed , dari ketenaran TypeScript Deep Dive , bahwa kita harus menghindari
export default
deklarasi generik untuk suatu kelas, dan sebagai gantinya menambahkanexport
tag ke deklarasi kelas. Kelas yang diimpor seharusnya terdaftar dalamimport
perintah modul.Itu adalah: bukannya
dan sederhana
import Foo from './foo';
dalam modul yang akan diimpor, kita harus menggunakannyadan
import {Foo} from './foo'
di importir.Alasannya adalah kesulitan dalam refactoring kelas, dan pekerjaan tambahan untuk ekspor. Posting asli oleh Basarat dalam
export default
dapat menyebabkan masalahsumber
Inilah contoh dengan mengekspor objek sederhana.
Di file utama (Gunakan saat Anda tidak ingin dan tidak perlu membuat instance baru) dan itu bukan global, Anda hanya akan mengimpor ini saat dibutuhkan:
sumber