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