¿Hay alguna manera de agregar métodos sobre la marcha a una clase usando TypeScript?

StackOverflow https://stackoverflow.com//questions/12698893

  •  12-12-2019
  •  | 
  •  

Pregunta

Estoy intentando crear algún tipo de método de Mixin que agregue métodos al prototipo / clase sobre la marcha, pero obtengo errores como

La propiedad 'GreetName' no existe en el valor del tipo 'Saludador' cualquiera

y

La propiedad 'GreetName' no existe en el valor del tipo 'Saludador' cualquiera

cuando ejecuto el siguiente código.

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

Greeter.prototype.greetName = function(name){
        return this.greet() + ' ' + name;
}

var greeter = new Greeter('Mr');

window.alert(greeter.greetName('Name'));

En realidad, se compila a JS válido y se ejecuta como se esperaba.¿Hay alguna manera de hacer esto sin las advertencias / errores del compilador?

¿Fue útil?

Solución

Esta solución tiene el beneficio de brindarle comprobación de tipo cuando agregue dinámicamente un método:

class MyClass {
    start() {

    }
}
var example = new MyClass();
// example.stop(); not allowed


interface MyClass {
  stop(): void;
}

MyClass.prototype['stop'] = function () {
    alert('Stop');
}
var stage2 = example;
stage2.stop();

Otros consejos

Necesitarían un concepto de clases parciales para que esto funcione que actualmente no es compatible.Le diré que lo que he encontrado funciona mejor para estos tipos de escenarios es usar interfaces en su lugar (he estado programando en TypeScript durante aproximadamente 6 meses, estoy en EM, pero no en el equipo de TyperScript)

Las interfaces son extensibles después del hecho simplemente defingando los métodos que está agregando a la interfaz.Como ejemplo de esto, si instala un complemento de jQuery, querrá volver a definir la interfaz IJQERY & IJQERYERYUL para incluir los métodos adicionales de los complementos.Desde ese punto, puede invocar los métodos de los complementos a través de $ .plugin () y Typycript será feliz.

Hay otra forma de hacer esto.

Greeter["SomeProperty"] = function() {
     return "somevalue";
};

funciona igual y usa la función de indexador de propiedades en JavaScript y TypScript no se queja.

similar al ejemplo de @fenton, pero sin las cosas gnarly:

class MyClass {
    start() {
    }
}
MyClass.prototype['stop'] = function () {
    alert('Stop');
}

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!

Así es como lo hace GenacodicEtGode lo hace

import {Observable} from "./observable"; // which is Greeter in your case 


declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}

Observable.prototype.map = function (f) {

}

Esto se llama aumento de módulo.

Después de tener que implementar métodos dinámicos y propiedades en las clases, esta fue la solución con la que pude ir para evitar que los compiladores de Typilscript se quejen:

...
window.alert(greeter['greetName']('Name'));

Básicamente, use el método de soporte de accesorios de propiedad .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top