interfaceadalah saat Anda hanya ingin mendeskripsikan bentuk suatu objek. Tidak ada pembuatan kode, selamanya, untuk antarmuka - mereka hanya artefak dalam sistem tipe. Anda tidak akan melihat perbedaan dalam pembuatan kode untuk sebuah kelas bergantung pada apakah kelas tersebut memiliki implementsklausa atau tidak .
declare classadalah ketika Anda ingin mendeskripsikan kelas yang ada (biasanya kelas TypeScript, tetapi tidak selalu) yang akan hadir secara eksternal (misalnya, Anda memiliki dua file .ts yang dikompilasi menjadi dua file .js dan keduanya disertakan melalui scripttag di halaman web). Jika Anda mewarisi dari classmenggunakan extends(terlepas dari apakah tipe dasar adalah declare classatau biasa class) compiler akan menghasilkan semua kode untuk menghubungkan rantai prototipe dan forwarding konstruktor dan apa yang tidak.
Jika Anda mencoba untuk mewarisi dari declare classyang seharusnya menjadi antarmuka, Anda akan mengalami kesalahan waktu proses karena kode yang dihasilkan akan merujuk ke objek tanpa manifestasi waktu proses.
Sebaliknya, jika Anda hanya implementsebuah antarmuka yang seharusnya menjadi declare class, Anda harus menerapkan ulang semua anggota sendiri dan tidak akan mengambil keuntungan dari penggunaan ulang kode apa pun dari kelas dasar calon, dan fungsi yang memeriksa rantai prototipe saat runtime akan menolak objek Anda karena tidak benar-benar menjadi turunan dari kelas dasar.
Untuk menjadi benar-benar kutu buku, jika Anda memiliki latar belakang C ++, Anda secara kasar dapat menganggap interfacesebagai typedefdan declare classsebagai externdeklarasi konstruktor yang benar-benar tidak memiliki definisi dalam unit kompilasi ini.
Dari sisi konsumsi murni (menulis kode imperatif, bukan menambahkan tipe baru), satu-satunya perbedaan antara interfacedan declare classadalah Anda tidak dapat newmembuat antarmuka. Namun, jika Anda bermaksud untuk extend/ implementsalah satu dari jenis ini di baru class, Anda benar-benar harus memilih dengan benar antara interfacedan declare class. Hanya satu yang akan berhasil.
Dua aturan yang akan membantu Anda dengan baik:
- Apakah nama tipe sejajar dengan fungsi konstruktor (sesuatu yang dapat dipanggil dengan
new) yang benar-benar ada saat runtime (misalnya Date, tetapi JQueryStatictidak)? Jika tidak , Anda pasti ingininterface
- Apakah saya berurusan dengan kelas yang dikompilasi dari file TypeScript lain, atau sesuatu yang cukup mirip? Jika ya , gunakan
declare class