Búsqueda de sitios web

javascript - ¿Cómo extender dinámicamente una clase con un método en TypeScript?


¿Cómo extender dinámicamente una clase con un método en TypeScript? ¿Algún ejemplo? Intento:

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

Pero el compilador me da un error.

Respuesta #1

La mayoría de las veces, necesitas hacer algo como:

interface UsersBlocksMyOrders {
    myFunc(): any;
}

De lo contrario, el compilador no lo sabe.


Incluso funciona con clases existentes. Por ejemplo:

interface String {
    logit(): void;
}

String.prototype.logit = function () {
    console.log(this);
}

let a = "string";
a.logit();

(código en el área de juegos)


Porque quieres cambiar algo en un módulo diferente, lo cual se llama Aumento de Módulo, necesitas hacer algo como:

Import { UsersBlocksMyOrders } from "../pages/users/blocks/myorders";

declare module "../pages/users/blocks/myorders" {
    interface UsersBlocksMyOrders {
        logit(): void;
    }
}

UsersBlocksMyOrders.prototype.logit = function () { console.log(this); }

Siempre que sea posible (lo cual parece ser para ti), edita el código fuente directamente. Hacerlo de esta manera solo debería hacerse cuando sea necesario.

Respuesta #2

Esto puede ayudar (desde aquí):

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

Artículos relacionados