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

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();

บทความที่เกี่ยวข้อง