typescript - คุณสมบัติของคลาสไม่ได้ขยายเป็นชนิดที่สืบทอด
เมื่อฉันกำหนดค่าบางส่วนให้กับตัวแปรที่ประกาศด้วยประเภทบางส่วน ประเภทของมันยังคงเป็นบางส่วน:
let x: { a: string, b?: string }
x = { a: "a" }
x.b // fine, x <=> {a:string, b?:string}
ก็เหมือนกับคุณสมบัติของคลาส:
class X {
prop: { a: string, b?: string } = { a: "a" }
}
(new X).prop.b // fine, prop <=> {a:string, b?:string}
อย่างไรก็ตาม ทรัพย์สินที่ สืบทอดมา ดูเหมือนจะไม่ปฏิบัติตามกฎนี้และกำหนดประเภทที่แน่นอนแทน:
class Y extends X {
prop = { a: "a" }
}
(new Y).prop.b // FAIL, prop <=> {a:string}
พีจี
พฤติกรรมนี้สามารถอธิบายได้อย่างไร?
คำตอบ #1
ปัญหาคือเมื่อมีการสร้างคลาส Y มันจะตรวจสอบว่า prop เข้ากันได้กับประเภท { a: string, b?: string } แต่จากนั้นมันจะคืนค่าประเภทที่แน่นอนของวัตถุ literal ที่คุณส่งมา ซึ่งไม่มี b คุณสามารถคืนค่า { a: string, b?: string } โดยตรง แต่คุณจะเสียชื่อคุณสมบัติของวัตถุ literal ซึ่งน่าเสียดาย ดังนั้นคุณสามารถลอง:
((new Y).prop as { a: string, b?: string }).b
