Mengapa Typescript menggunakan kata kunci “ekspor” untuk membuat kelas dan antarmuka publik?

136

Ketika mencoba-coba dengan Scriptrip, saya menyadari bahwa kelas saya di dalam modul (digunakan sebagai ruang nama) tidak tersedia untuk kelas lain kecuali saya menulis exportkata kunci sebelumnya, seperti:

module some.namespace.here
{
   export class SomeClass{..}
}

Jadi sekarang saya bisa menggunakan kode di atas seperti ini:

var someVar = new some.namespace.here.SomeClass();

Namun saya hanya bertanya-tanya mengapa kata kunci ini digunakan dibandingkan dengan hanya menggunakan publickata kunci yang digunakan pada tingkat metode untuk menandakan bahwa suatu metode atau properti harus dapat diakses secara eksternal. Jadi mengapa tidak menggunakan mekanisme yang sama ini untuk membuat kelas dan antarmuka dll terlihat secara eksternal?

Ini akan menghasilkan kode seperti:

module some.namespace.here
{
   public class SomeClass{..}
}
Grofit
sumber

Jawaban:

176

Alasan utamanya adalah yang exportcocok dengan rencana untuk ECMAScript. Anda bisa berargumen bahwa "mereka seharusnya menggunakan" ekspor "dan bukan" publik ", tetapi selain dari" ekspor / pribadi / terlindungi "menjadi pengubah akses yang tidak cocok, saya percaya ada perbedaan yang tidak kentara antara keduanya yang menjelaskan hal ini. .

Di TypeScript, menandai anggota kelas sebagai publicatau privatetidak berpengaruh pada JavaScript yang dihasilkan. Ini hanyalah alat desain / kompilasi waktu yang dapat Anda gunakan untuk menghentikan kode TypeScript Anda mengakses hal-hal yang seharusnya tidak.

Dengan exportkata kunci, JavaScript menambahkan baris untuk menambahkan item yang diekspor ke modul. Dalam contoh Anda: here.SomeClass = SomeClass;.

Jadi secara konseptual, visibilitas dikendalikan oleh publicdan privatehanya untuk tooling, sedangkan exportkata kunci mengubah output.

Fenton
sumber
1
Terima kasih atas informasinya, saya berasumsi bahwa keputusan itu seperti yang Anda katakan untuk menghindari harus memeriksa konteks kata kunci, yang memalukan karena rasanya seperti sesuatu yang akan membuat beberapa orang naik dan benar-benar tidak memiliki perbedaan logis dalam perilaku bagaimana Anda mengharapkan publik untuk bertindak, hanya membuat implementasinya lebih mudah.
Grofit
Terima kasih untuk ini. Menghemat rambutku.
Kent Aguilar
1
Diperlukan jika Anda menggunakan modul. Jika aplikasi Anda mengarah ke sisi yang lebih besar, modul biasanya merupakan pilihan yang lebih baik daripada membuat bundel besar / memuat semua file Anda di muka.
Fenton
@Fenton Bukankah maksud Anda "Anda bisa berargumen bahwa mereka seharusnya menggunakan 'publik' alih-alih 'ekspor'?
Alan Evangelista
@AlanEvangelista Anda tentu bisa berdebat seperti itu juga, terutama jika latar belakang Anda adalah Java / C # daripada JavaScript.
Fenton
49

Beberapa hal untuk ditambahkan ke jawaban Steve Fenton:

  • export sudah berarti dua hal yang berbeda (tergantung pada apakah itu di tingkat atas atau tidak); berarti sepertiga mungkin lebih buruk daripada menambahkan public/private
  • Jelas bukan untuk membuat implementasi lebih mudah; kompleksitas ditambahkan publicvs exportsepele. Kami telah mengubah kata kunci di sekitar sekelompok; itu tidak sulit.
  • Visibilitas default anggota kelas harus publik untuk menyelaraskan dengan proposal kelas ES6, oleh karena itu kami memerlukan beberapa kata kunci untuk menunjukkan "tidak publik". Tidak ada antonim yang cocok untuk export( unexport??), begitu privatejuga pilihan yang logis. Setelah Anda memilikinya private, akan agak gila untuk tidak memilih publicsebagai mitra
  • Penggunaan exportuntuk mengubah visibilitas dalam modul internal adalah penyelarasan tebakan terbaik dengan modul ES6
Ryan Cavanaugh
sumber
1
terima kasih atas informasi tambahan, saya sepenuhnya setuju dengan publik / pribadi di tingkat anggota, saya merasa aneh tidak cukup untuk semua tingkat akses. Namun ini adalah pendapat pribadi dan kata kunci adalah kata kunci, hanya ingin mencari tahu lebih lanjut.
Grofit
5
Saya mengurangi pernyataan kurang ajar saya tentang kemudahan implementasi dan menawarkan +1 sebagai permintaan maaf :)
Fenton
2
Saya setuju dengan beberapa yang Anda katakan, tetapi saya tidak setuju dengan pernyataan "Tidak ada antonim yang cocok untuk diekspor" - "impor" adalah antonimnya, dan apa yang digunakan TypeScript, ketika Anda mendefinisikan kelas yang dapat diekspor, Anda kemudian impor ke file export class User { name: string } lain File lain: import {User} from ""./the_file_path_to_the_user_class; lihat bagian 3.3 dari dokumen asli di sini docs.nativescript.org/angular/tutorial/ng-chapter-3
Adam Diament
3
Bagaimana menggunakan importuntuk menunjukkan "nilai ini tidak diekspor " menjadi penggunaan kata kunci yang sesuai?
Ryan Cavanaugh
5
"Tidak ada antonim yang cocok untuk diekspor (tidak diekspor ??)" - antonim yang cocok untuk ekspor harus embargo.
rsp