جاوااسکریپت - چگونه کلاس را به صورت پویا با متد در تایپاسکریپت گسترش دهیم؟


چگونه میتوان کلاس را به صورت پویا با متد در TypeScript گسترش داد؟ نمونهای دارید؟ من امتحان میکنم:

UsersBlocksMyOrders.prototype.myFunc = function():any{
  alert('23434');
};

اما کامپایلر به من خطا میدهد.

پاسخ شماره ۱

اغلب اوقات، شما نیاز دارید کاری شبیه به این انجام دهید:

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

هر زمان که ممکن است (که به نظر میرسد برای شما اینطور است)، کد منبع را مستقیماً ویرایش کنید. انجام این کار به این شکل باید فقط در مواقع ضروری انجام شود.

پاسخ شماره ۲

این ممکن است کمک کند (از اینجا):

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