javascript - วิธีการขยายคลาสแบบไดนามิกด้วยเมธอดใน TypeScript?
วิธีการขยายคลาสด้วยเมธอดแบบไดนามิกใน TypeScript? มีตัวอย่างไหม? ฉันลอง:
UsersBlocksMyOrders.prototype.myFunc = function():any{
alert('23434');
};
แต่ตัวคอมไพเลอร์แจ้งข้อผิดพลาดกับฉัน
คำตอบ #1
ส่วนใหญ่แล้ว คุณจำเป็นต้องทำบางอย่างเช่น:
interface UsersBlocksMyOrders {
myFunc(): any;
}
มิฉะนั้นตัวคอมไพเลอร์จะไม่ทราบเกี่ยวกับมัน
มันสามารถทำงานกับคลาสที่มีอยู่แล้วได้ด้วย ตัวอย่างเช่น:
interface String {
logit(): void;
}
String.prototype.logit = function () {
console.log(this);
}
let a = "string";
a.logit();
(โค้ดในสนามเด็กเล่น)
เพราะคุณต้องการเปลี่ยนบางสิ่งในโมดูลที่ต่างออกไป ซึ่งเรียกว่า การขยายโมดูล คุณจึงจำเป็นต้องทำบางสิ่งเช่น:
Import { UsersBlocksMyOrders } from "../pages/users/blocks/myorders";
declare module "../pages/users/blocks/myorders" {
interface UsersBlocksMyOrders {
logit(): void;
}
}
UsersBlocksMyOrders.prototype.logit = function () { console.log(this); }
เมื่อใดก็ตามที่เป็นไปได้ (ซึ่งดูเหมือนว่าจะเป็นสำหรับคุณ) ให้แก้ไขโค้ดต้นฉบับโดยตรง การทำเช่นนี้ควรทำเฉพาะเมื่อจำเป็นเท่านั้น
คำตอบ #2
นี่อาจช่วยได้ (จากตรงนี้):
function extend<T, U>(first: T, second: U): T & U {
let result = <T & U>{};
for (let id in first) {
(<any>result)[id] = (<any>first)[id];
}
for (let id in second) {
if (!result.hasOwnProperty(id)) {
(<any>result)[id] = (<any>second)[id];
}
}
return result;
}
class Person {
constructor(public name: string) { }
}
interface Loggable {
log(): void;
}
class ConsoleLogger implements Loggable {
log() {
// ...
}
}
var jim = extend(new Person("Jim"), new ConsoleLogger());
var n = jim.name;
jim.log();
