Apa perbedaan antara modul internal dan eksternal dalam TypeScript?
Saya telah menghabiskan beberapa waktu membaca spesifikasi bahasa Typescript dan agak bingung tentang perbedaan antara modul internal dan modul eksternal. Berikut ini adalah deskripsi yang diambil langsung dari spesifikasi:
Modul internal (bagian 9.2.2) adalah anggota lokal atau yang diekspor dari modul lain (termasuk modul global dan modul eksternal). Modul internal dinyatakan menggunakan DeklarasiModul yang menentukan nama dan tubuhnya. Jalur nama dengan lebih dari satu pengenal setara dengan serangkaian deklarasi modul internal yang bersarang.
Modul eksternal (bagian 9.4) adalah kumpulan kode yang dimuat secara terpisah dan direferensikan menggunakan nama modul eksternal. Modul eksternal ditulis sebagai file sumber terpisah yang berisi setidaknya satu deklarasi impor atau ekspor. Selain itu, modul eksternal dapat dideklarasikan menggunakan AmbientModuleDeclarations di modul global yang langsung menentukan nama modul eksternal sebagai literal string. Hal ini dijelaskan lebih lanjut di bagian 0.
Dari apa yang saya pahami, saya pikir modul eksternal sesuai dengan file typescript tanpa definisi modul yang menyertainya yang hanya mengekspor sekumpulan tipe dan/atau variabel. Dari file typescript lain, saya bisa dengan mudah mengimpor modul eksternal di foo.ts dengan import foo=module("foo");
Bisakah seseorang menjelaskan kepada saya perbedaan antara modul eksternal dan internal?
Jawaban #1
Bagian 9.3 dan 9.4 dari spesifikasi menjelaskan ini dengan lebih jelas. Saya akan menyalin di sini beberapa contoh yang diberikan di bagian-bagian tersebut.
Modul eksternal
Misalkan kode berikut ada di main.ts.
import log = module("log");
log.message("hello");
File ini merujuk pada modul eksternal log, yang didefinisikan oleh apapun yang diekspor oleh log.ts.
export function message(s: string) {
console.log(s);
}
Perhatikan bahwa log.ts tidak menggunakan kata kunci module di mana pun. File ini hanya mengekspor hal-hal dengan export.
Modul internal
File ini memiliki dua modul internal, X.Y.Z.
module A.B.C {
import XYZ = X.Y.Z;
export function ping(x: number) {
if (x > 0) XYZ.pong(x - 1);
}
}
module X.Y.Z {
import ABC = A.B.C;
export function pong(x: number) {
if (x > 0) ABC.ping(x - 1);
}
}
Ini berperilaku (sebagian besar) seperti modul eksternal, tetapi mereka terkandung dalam satu file dan Anda tidak perlu merujuk file luar apa pun untuk menggunakannya. Mereka harus terkandung di dalam blok module ketika didefinisikan.
Jawaban #2
Menurut presentasi Anders: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) dan dokumentasi Typescript, modul eksternal adalah modul yang didasarkan pada AMD (Asynchronous Model Definition) atau CommonJS.
Modul eksternal berguna dalam pengertian bahwa mereka menyembunyikan pernyataan internal dari definisi modul dan hanya menampilkan metode serta parameter yang terkait dengan variabel yang dideklarasikan.
Misalkan Anda memiliki kelas Main dengan metode log yang telah didefinisikan dan ditempatkan di file transfer.js. Metode internal dari kelas Main hanya terlihat ketika Anda mengimpor file transfer.js di bagian atas file sumber js seperti ini: ///<reference path="transfer.js"/>. Dengan cara ini compiler menghilangkan penelusuran semua file js saat runtime.
Ini adalah keuntungan besar dari menggunakan modul eksternal. Yang lainnya adalah ketika Anda mencoba merujuk metode atau kelas eksternal yang dalam alur JavaScript normal dari atas ke bawah didefinisikan lebih lambat daripada pemanggilan metode. Dengan menggunakan modul eksternal, kelas yang dirujuk hanya diinstansiasi saat pemanggilan metode.
