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

วิธีรวมคุณสมบัติพารามิเตอร์ตัวสร้างของ 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);
    }
}

บทความที่เกี่ยวข้อง