ฉันคิดว่าคุณมีตัวเลือกต่างกันห้าแบบจะทำเช่นนั้น การเลือกระหว่างพวกเขาอาจเป็นเรื่องง่ายขึ้นอยู่กับเป้าหมายที่คุณต้องการบรรลุ
วิธีที่ดีที่สุดในกรณีส่วนใหญ่เพื่อใช้คลาสและสร้างอินสแตนซ์เนื่องจากคุณใช้ TypeScript เพื่อใช้การตรวจสอบชนิด
interface IModal {
content: string;
form: string;
//...
//Extra
foo: (bar: string): void;
}
class Modal implements IModal {
content: string;
form: string;
foo(param: string): void {
}
}
แม้ว่าวิธีการอื่นจะเสนอวิธีที่ง่ายกว่าในการสร้างวัตถุจากส่วนต่อประสานคุณควรพิจารณาแยกส่วนต่อประสานออกจากกันถ้าคุณกำลังใช้วัตถุของคุณสำหรับเรื่องต่าง ๆ และไม่ทำให้ส่วนต่อประสาน:
interface IBehaviour {
//Extra
foo(param: string): void;
}
interface IModal extends IBehaviour{
content: string;
form: string;
//...
}
ในทางกลับกันตัวอย่างเช่นระหว่างการทดสอบหน่วยรหัสของคุณ (ถ้าคุณไม่ใช้การแยกข้อกังวลบ่อย) คุณอาจยอมรับข้อเสียเพื่อประสิทธิภาพในการทำงาน คุณอาจใช้วิธีการอื่นเพื่อสร้าง mocks ส่วนใหญ่สำหรับอินเทอร์เฟซ * .d.ts ของบุคคลที่สามที่มีขนาดใหญ่ และมันอาจเป็นความเจ็บปวดที่จะใช้วัตถุที่ไม่ระบุชื่อเต็มรูปแบบสำหรับทุก ๆ อินเทอร์เฟซขนาดใหญ่
บนเส้นทางนี้ตัวเลือกแรกของคุณคือสร้างวัตถุว่างเปล่า :
var modal = <IModal>{};
ประการที่สองที่จะตระหนักถึงส่วนที่ได้รับคำสั่งของอินเตอร์เฟซของคุณ มันจะมีประโยชน์ไม่ว่าคุณจะเรียกไลบรารี JavaScript ของบุคคลที่สาม แต่ฉันคิดว่าคุณควรสร้างคลาสแทนเช่นก่อนหน้านี้:
var modal: IModal = {
content: '',
form: '',
//...
foo: (param: string): void => {
}
};
ประการที่สามคุณสามารถสร้างเพียงส่วนหนึ่งของอินเทอร์เฟซของคุณและสร้างวัตถุที่ไม่ระบุชื่อแต่วิธีนี้คุณมีหน้าที่รับผิดชอบในการปฏิบัติตามสัญญา
var modal: IModal = <any>{
foo: (param: string): void => {
}
};
สรุปคำตอบของฉันแม้ว่าอินเทอร์เฟซจะไม่ใส่ก็ได้เพราะมันไม่ได้ถูกแปลงเป็นโค้ด JavaScript แต่ TypeScript มีไว้เพื่อให้มีระดับของ abstraction ใหม่หากใช้อย่างชาญฉลาดและสม่ำเสมอ ฉันคิดว่าเพียงเพราะคุณสามารถยกเลิกพวกเขาในกรณีส่วนใหญ่จากรหัสของคุณเองที่คุณไม่ควร