เกิดอะไรขึ้น
ปัญหาคือinstanceofสร้างจาก JavaScript และใน JavaScript instanceofคาดว่าจะมีค่าสำหรับตัวถูกดำเนินการด้านขวา โดยเฉพาะในx instanceof FooJavaScript จะทำการตรวจสอบรันไทม์เพื่อดูว่าFoo.prototypeมีอยู่ที่ใดในห่วงโซ่ต้นแบบของxมีอยู่ที่ใดก็ได้ในห่วงโซ่ต้นแบบของ
อย่างไรก็ตามใน TypeScript interfaceไม่มีการปล่อยออกมา นั่นหมายความว่าไม่ใช่FooหรือFoo.prototypeอยู่ที่รันไทม์ดังนั้นรหัสนี้แน่นอนจะล้มเหลว
TypeScript พยายามบอกคุณว่าสิ่งนี้ไม่สามารถใช้ได้Fooเป็นเพียงประเภทไม่ใช่มูลค่าเลย!
"ฉันจะทำอะไรแทน instanceofไหม”
คุณสามารถมองเข้าไปในยามชนิดและผู้ใช้กำหนดยามประเภท
"แต่ถ้าฉันเพิ่งเปลี่ยนจากinterface เป็นclass?"
คุณอาจถูกล่อลวงให้เปลี่ยนจาก an interfaceเป็น a classแต่คุณควรตระหนักว่าในระบบโครงสร้างของ TypeScript (โดยที่สิ่งต่างๆขึ้นอยู่กับรูปร่าง ) คุณสามารถสร้างวัตถุใด ๆ ที่มีรูปร่างเหมือนกับคลาสที่กำหนด:
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;
ในกรณีนี้คุณมีxและyมีประเภทเดียวกัน แต่ถ้าคุณลองใช้instanceofอย่างใดอย่างหนึ่งคุณจะได้ผลลัพธ์ตรงกันข้ามกับอีกแบบหนึ่ง ดังนั้นinstanceofจะไม่ได้จริงๆบอกคุณมากเกี่ยวกับชนิดถ้าคุณกำลังใช้ประโยชน์จากโครงสร้างในประเภท typescript
Foo | stringเอง