ค้นหาเว็บไซต์

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