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