เกิดอะไรขึ้น
ปัญหาคือinstanceof
สร้างจาก JavaScript และใน JavaScript instanceof
คาดว่าจะมีค่าสำหรับตัวถูกดำเนินการด้านขวา โดยเฉพาะในx instanceof Foo
JavaScript จะทำการตรวจสอบรันไทม์เพื่อดูว่า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
เอง