วิธีรวมคุณสมบัติพารามิเตอร์ตัวสร้างของ TypeScript กับการสืบทอดคลาสและตัวสร้างของซูเปอร์คลาสอย่างไร?
ผมเข้าใจว่า ใน TypeScript สามารถ:
- ประกาศคุณสมบัติของคลาสจากการประกาศตัวสร้างโดยใช้คุณสมบัติของพารามิเตอร์
- สืบทอดจากคลาสพื้นฐาน ซึ่งในกรณีนี้ ตัวสร้างของคลาสที่สืบทอดต้องเรียกตัวสร้างของคลาสพื้นฐาน
เป็นไปได้ไหมที่จะรวมพฤติกรรมสองอย่างนี้เข้าด้วยกัน? กล่าวคือ เป็นไปได้ไหมที่จะประกาศคลาสฐานซึ่งใช้คุณสมบัติพารามิเตอร์ แล้วสืบทอดจากมันในคลาสย่อยซึ่งก็ใช้คุณสมบัติพารามิเตอร์เช่นกัน? คลาสย่อยจำเป็นต้องประกาศซ้ำ พาสพวกมันเข้าไปในการเรียกตัวสร้างของซูเปอร์คลาส หรือไม่ เป็นต้น?
นี่ค่อนข้างสับสน และฉันไม่สามารถหาในเอกสารได้ว่านี่ตั้งใจให้เป็นไปได้หรือไม่ หรือถ้าเป็นไปได้ จะทำอย่างไร
ขอบคุณล่วงหน้าหากใครมีข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้
คำตอบ #1
คุณสามารถรวมทั้งสองอย่างได้ แต่จากมุมมองของคลาสที่สืบทอด ฟิลด์ที่ประกาศเป็นอาร์กิวเมนต์ของคอนสตรัคเตอร์จะเป็นฟิลด์ปกติและอาร์กิวเมนต์ของคอนสตรัคเตอร์
class Base {
constructor(public field: string) { // base class declares the field in constructor arguments
}
}
class Derived extends Base{
constructor(public newField: string, // derived class can add fields
field: string // no need to redeclare the base field
) {
super(field); // we pass it to super as we would any other parameter
}
}
หมายเหตุ
คุณสามารถประกาศฟิลด์ใหม่ในอาร์กิวเมนต์ของคอนสตรัคเตอร์ได้ แต่จะต้องปฏิบัติตามกฎสำหรับการประกาศฟิลด์ใหม่ (ประเภทที่เข้ากันได้และตัวแก้ไขการมองเห็น)
ดังนั้นนี่ก็ใช้ได้:
class Base {
constructor(public field: string) {
}
}
class Derived extends Base{
constructor(public field: string) { //Works, same modifier, same type, no harm from redeclration
super(field);
}
}
แต่นี่จะใช้ไม่ได้ :
class Base {
// private field
constructor(private field: string) {
}
}
class Derived extends Base{
constructor(private field: string) { //We can't redeclare a provate field
super(field);
}
}
