Apa yang sedang terjadi
Masalahnya adalah itu instanceofadalah konstruksi dari JavaScript, dan dalam JavaScript, instanceofmengharapkan nilai untuk operan sisi kanan. Secara khusus, di x instanceof FooJavaScript akan melakukan pemeriksaan waktu proses untuk melihat apakah Foo.prototypeada di mana saja dalam rantai prototipe x.
Namun, dalam TypeScript, interfaces tidak memiliki emit . Itu berarti bahwa baik Fooatau Foo.prototypeada pada saat runtime, jadi kode ini pasti akan gagal.
TypeScript mencoba memberi tahu Anda bahwa ini tidak akan pernah berhasil. Foohanyalah 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 interfaceke 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 xdan yyang memiliki tipe yang sama, tetapi jika Anda mencoba menggunakan instanceofsalah satu, Anda akan mendapatkan hasil yang berlawanan di sisi lain. Jadi instanceoftidak akan benar-benar memberitahu Anda banyak tentang jenis jika Anda mengambil keuntungan dari jenis struktural dalam naskah.
Foo | string.