ความแตกต่างระหว่างมิกซินกับชนิดตัดกันใน TypeScript คืออะไร?
การดูเอกสาร TypeScript และลองตัวอย่างเกี่ยวกับ Intersection Types และ Mixins ใน TypeScript โดยใช้วิธีการช่วยเหลือที่มีให้ ผมเห็นพฤติกรรมและผลลัพธ์ที่แทบจะเหมือนกันจากทั้งสองวิธี ผมสุดท้ายจะได้วัตถุที่เป็นการรวมกันของ 1..n ชนิด, Interfaces, หรือ Classes นี่คือวิธีการที่ผมใช้ในตัวอย่างโค้ดของผมและมาจากเอกสาร TypeScript โดยตรง
สิ่งนี้ใช้ในการประยุกต์ mixins ใน TypeScript:
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name));
});
});
}
นี่คือสิ่งที่ฉันใช้สำหรับ ประเภทการตัดกัน:
function extend<First, Second>(first: First, second: Second): First & Second {
const result: Partial<First & Second> = {};
for (const prop in first) {
if (first.hasOwnProperty(prop)) {
(<First>result)[prop] = first[prop];
}
}
for (const prop in second) {
if (second.hasOwnProperty(prop)) {
(<Second>result)[prop] = second[prop];
}
}
return <First & Second>result;
}
นอกจากข้อเท็จจริงที่ว่าเมธอด mixins รับอาร์เรย์ และเมธอด intersection type รับค่า 2 ค่าโดยเฉพาะ พวกมันในที่สุดจากมุมมองพฤติกรรมก็ทำงานเหมือนกัน ถ้าฉันมีคลาส Person และ User แต่ละคลาสมีคุณสมบัติและเมธอดแยกกัน หลังจากใช้วิธีใดวิธีหนึ่งข้างต้น ฉันก็สามารถสร้างอินสแตนซ์ใหม่จากประเภทที่กำหนดโดย intersection type หรือ mixin และเห็นการรวมกันของทุกสิ่งจากทั้ง Person และ User
น่าขันที่นี่คือสิ่งที่ฉันต้องการพอดี แต่ฉันรู้สึกว่าฉันกำลังพลาดจุดประสงค์ของ เมื่อไร ที่จะใช้แต่ละอย่าง ฉันได้ค้นหาข้อมูลและพบโพสต์นี้ที่เกี่ยวข้องกับ JavaScript (ความต่างระหว่าง mixin() และ extend() ในไลบรารี JavaScript) แต่ฉันไม่แน่ใจว่า extend ในกรณีนี้เหมือนกับ intersection type ใน TypeScript หรือไม่ (ถึงแม้ว่าวิธีช่วยเรียกใช้จะถูกเรียกแบบนั้นพอดี)
มองไปที่วิธีช่วยเหลือทั้งสอง พวกมัน ดูเหมือน จะคัดลอกหรือกำหนดคุณสมบัติจาก A ไป B ตามที่ต้องการอย่างแม่นยำ มีใครช่วยอธิบายความแตกต่างระหว่างสองวิธีใน TypeScript และทำไมวิธีหนึ่งถึงถูกใช้มากกว่าอีกวิธีได้ไหม?
คำตอบ #1
ฉันจะลองแสดงความคิดเห็นของฉันดู
มิกซิน มีไว้เพื่อเปลี่ยนแปลงการกำหนดคลาสโดยเพิ่มฟังก์ชันการทำงานที่ให้โดยออบเจกต์อื่น ๆ มันทำงานบนพรอทไทป์ ดังนั้นผลกระทบจะเกิดขึ้นกับอินสแตนซ์ทั้งหมด ทั้งที่สร้างแล้ว และ อินสแตนซ์ในอนาคต
จุดตัด มีไว้เพื่อขยายคุณสมบัติของ ตัวอย่างที่กำหนดหนึ่งตัว โดยไม่เปลี่ยนแปลงตัวอย่างเดิม แท้จริงแล้ว วัตถุที่ส่งกลับเป็นตัวอย่างใหม่เอี่ยม
const result: Partial<First & Second> = {};
ดังนั้นในความคิดของฉัน ความแตกต่างมันใหญ่ โดยที่ถ้าไม่ทำงานกับต้นแบบ สิ่งที่ให้มาจะเป็นแค่ตัวอย่างเดียวที่ใช้แล้วทิ้ง ตัวอย่างของคลาสเดียวกันจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลง เพราะไม่มีอะไรสะท้อนในต้นแบบของคลาส
