Di TypeScript, saat membuat file deklarasi sumber .d.ts, mana yang lebih disukai dan mengapa?
declare class Example {
public Method(): void;
}
atau
interface Example {
Method(): void;
}
Perbedaan yang dapat saya ceritakan adalah bahwa antarmuka tidak dapat memiliki metode statis, jadi Anda harus menggunakan kelas untuk itu. Keduanya tidak menghasilkan keluaran JS, jadi mungkin itu tidak masalah?
javascript
typescript
Chris
sumber
sumber
Jawaban:
interface
adalah 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 memilikiimplements
klausa atau tidak .declare class
adalah 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 melaluiscript
tag di halaman web). Jika Anda mewarisi dariclass
menggunakanextends
(terlepas dari apakah tipe dasar adalahdeclare class
atau biasaclass
) compiler akan menghasilkan semua kode untuk menghubungkan rantai prototipe dan forwarding konstruktor dan apa yang tidak.Jika Anda mencoba untuk mewarisi dari
declare class
yang 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
implement
sebuah antarmuka yang seharusnya menjadideclare 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
interface
sebagaitypedef
dandeclare class
sebagaiextern
deklarasi 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
interface
dandeclare class
adalah Anda tidak dapatnew
membuat antarmuka. Namun, jika Anda bermaksud untukextend
/implement
salah satu dari jenis ini di baruclass
, Anda benar-benar harus memilih dengan benar antarainterface
dandeclare class
. Hanya satu yang akan berhasil.Dua aturan yang akan membantu Anda dengan baik:
new
) yang benar-benar ada saat runtime (misalnyaDate
, tetapiJQueryStatic
tidak)? Jika tidak , Anda pasti ingininterface
declare class
sumber
new
operator pada tipe antarmuka. Namun, antarmuka dapat memiliki tanda tangan konstruksi, yang berarti Anda dapat memanggilnew
operator pada nilai tipe antarmuka. Ini sangat berbeda dari caraclass
kerjanya, di mana tanda tangan konstruksi berada pada nama tipe itu sendiri dan bukan pada ekspresi tipe itu.Anda dapat mengimplementasikan antarmuka:
Sedangkan
declare class
sintaks sebenarnya dimaksudkan untuk digunakan untuk menambahkan definisi tipe untuk kode eksternal yang tidak tertulis dalam TypeScript - jadi implementasinya adalah "di tempat lain".sumber
Dalam istilah awam,
declare
digunakan di.ts
/d.ts
files untuk memberi tahu kompiler bahwa kita harus mengharapkan kata kunci kitadeclaring
ada di lingkungan itu, bahkan jika itu tidak ditentukan dalam file saat ini. Ini kemudian akan memungkinkan kita untuk memiliki keamanan tipe saat menggunakan objek yang dideklarasikan, karena compiler Typecript sekarang tahu bahwa beberapa komponen lain mungkin menyediakan variabel itu.sumber
Perbedaan antara
declare
daninterface
di TS:menyatakan:
Dalam kode di atas
declare
memungkinkan kompiler TS mengetahui bahwa di suatu tempat kelasExample
dideklarasikan. Ini tidak berarti bahwa kelas tersebut disertakan secara ajaib. Anda sebagai programmer bertanggung jawab untuk menyediakan kelas saat Anda mendeklarasikannya (dengandeclare
kata kunci).antarmuka:
An
interface
adalah konstruksi virtual yang hanya ada dalam skrip ketikan. Kompilator naskah ketikan menggunakannya hanya untuk tujuan pemeriksaan jenis. Ketika kode dikompilasi ke javascript seluruh konstruksi ini akan dilucuti. Kompilator skrip menggunakan antarmuka untuk memeriksa apakah objek memiliki struktur yang benar.Misalnya ketika kita memiliki antarmuka berikut:
Objek yang kita definisikan yang memiliki tipe antarmuka ini harus sama persis dengan antarmuka:
sumber