Apa yang sedang terjadi
Masalahnya adalah itu instanceof
adalah konstruksi dari JavaScript, dan dalam JavaScript, instanceof
mengharapkan nilai untuk operan sisi kanan. Secara khusus, di x instanceof Foo
JavaScript akan melakukan pemeriksaan waktu proses untuk melihat apakah Foo.prototype
ada di mana saja dalam rantai prototipe x
.
Namun, dalam TypeScript, interface
s tidak memiliki emit . Itu berarti bahwa baik Foo
atau Foo.prototype
ada pada saat runtime, jadi kode ini pasti akan gagal.
TypeScript mencoba memberi tahu Anda bahwa ini tidak akan pernah berhasil. Foo
hanyalah sebuah tipe, itu bukanlah nilai sama sekali!
"Apa yang bisa saya lakukan sebagai gantinya instanceof
?"
Anda dapat melihat pelindung tipe dan pelindung tipe yang ditentukan pengguna .
"Tapi bagaimana jika aku baru saja beralih dari a interface
ke a class
?"
Anda mungkin tergoda untuk beralih dari a interface
ke a class
, tetapi Anda harus menyadari bahwa dalam sistem tipe struktural TypeScript (di mana hal-hal terutama berbasis bentuk ), Anda dapat menghasilkan objek apa pun yang memiliki bentuk yang sama dengan kelas yang diberikan:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
x = y;
y = x;
Dalam hal ini, Anda memiliki x
dan y
yang memiliki tipe yang sama, tetapi jika Anda mencoba menggunakan instanceof
salah satu, Anda akan mendapatkan hasil yang berlawanan di sisi lain. Jadi instanceof
tidak akan benar-benar memberitahu Anda banyak tentang jenis jika Anda mengambil keuntungan dari jenis struktural dalam naskah.
Foo | string
.