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

การสะท้อน - TypeScript: ตรวจสอบว่าคลาสที่สืบทอดมีการใช้งานเมธอดหรือไม่


ฉันมีคลาสสองคลาส หนึ่งคลาสสืบทอดจากอีกคลาสหนึ่ง และในคลาสฐานฉันต้องตรวจสอบว่าคลาสที่สืบทอดได้กำลังใช้งานเมธอดที่มีชื่อเฉพาะหรือไม่:

class Foo {
    constructor() { }

    childHasMethod() {
        if(this.method) {
            console.log('Yay');
        } else {
            console.log('Nay');
        }
    }
}

class Bar extends Foo {
    constructor() {
        super();
        this.childHasMethod();
    }

    method() {

    }
}

var bar = new Bar();

แม้ว่าบรรทัด if(this.method) { จะถูกทำเครื่องหมายสีแดงใน Playground แต่ก็ยังทำงานได้ แต่คอมไพเลอร์ในเครื่องจะเกิดข้อผิดพลาดในการคอมไพล์: คุณสมบัติ 'method' ไม่มีอยู่บนค่าประเภท 'Foo'.

มีวิธีที่สะอาดในการทำสิ่งที่ฉันพยายามทำหรือไม่?

คำตอบ #1

เพื่อที่จะ "หลบมันจากคอมไพเลอร์" คุณสามารถถือว่า this เป็นไดนามิกได้:

(<any>this).method

ฉันได้ทำตัวอย่างเต็มของสิ่งนี้ไว้บน TypeScript Playground แล้ว

childHasMethod() {
    if((<any>this).method) {
        alert('Yay');
    } else {
        alert('Nay');
    }
}

กล่าวอย่างนี้ การที่คลาสฐานรู้รายละเอียดเกี่ยวกับซับคลาสของมันอาจทำให้คุณตกอยู่ในสถานการณ์ที่ยุ่งยาก ปกติฉันจะพยายามหลีกเลี่ยงสิ่งนี้เพราะมันฟังดูเหมือนว่าการเชี่ยวชาญเฉพาะตัวรั่วไหลเข้าสู่คลาสฐาน - แต่คุณอาจมีสิ่งพิเศษที่คุณกำลังทำและรู้โปรแกรมของคุณดีกว่าฉัน ดังนั้นฉันไม่ได้พูดว่า "อย่าทำสิ่งนี้" - แค่ถามว่า "คุณแน่ใจไหม" :)