Esiste un modo per aggiungere metodi al volo per una classe utilizzando dattiloscritto?

voti
17

Sto cercando di creare una sorta di metodo intermedia che aggiunge metodi al prototipo / classe al volo ma ottengo errori come

La proprietà 'greetName' non esiste sul valore di tipo 'Greeter' qualsiasi

e

La proprietà 'greetName' non esiste sul valore di tipo 'Greeter' qualsiasi

quando si esegue il seguente codice.

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

In realtà compila in js e corre validi come previsto. C'è un modo per fare questo con avvertimenti del compilatore / errori?

È pubblicato 02/10/2012 alle 22:49
fonte dall'utente
In altre lingue...                            


6 risposte

voti
15

Questa soluzione ha il vantaggio di dare il controllo di tipo quando si aggiunge dinamicamente un metodo:

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();
Risposto il 06/06/2013 a 17:02
fonte dall'utente

voti
8

C'è un altro modo per fare questo.

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

Funziona lo stesso e utilizza la funzione di proprietà indicizzatore in javascript e dattiloscritto non si lamenta.

Risposto il 19/12/2012 a 16:06
fonte dall'utente

voti
8

Avrebbero bisogno di un concetto di classi parziali per questo al lavoro che attualmente non sono supportati. Te lo dico io che cosa ho trovato funziona meglio per questi tipi di scenari è quello di utilizzare le interfacce invece (Sono stato di programmazione a macchina per circa 6 mesi - sono a MS, ma non sulla squadra dattiloscritto)

Le interfacce sono estensibili dopo il fatto, semplicemente definging i metodi si sta aggiungendo l'interfaccia. Come esempio di questo, se si installa un plugin jQuery ti consigliamo di ri-definire l'interfaccia IJQuery & IJQueryUtil per includere i plugin metodi aggiuntivi. Da quel punto in avanti si possono richiamare i metodi plugins attraverso $ .plugin () e dattiloscritto sarà felice.

Risposto il 02/10/2012 a 23:22
fonte dall'utente

voti
1

Simile a @Fenton esempio, ma senza la roba nodoso:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Risposto il 26/05/2018 a 14:16
fonte dall'utente

voti
0

Ecco come RxJSlo fa

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) {

}

Questo è chiamato modulo additiva.

Risposto il 23/10/2018 a 00:21
fonte dall'utente

voti
0

Dopo aver dovuto implementare i metodi e le proprietà dinamiche sulle classi, questa era la soluzione sono stato in grado di andare con per evitare che il compilatore tipografico da lamentarsi:

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

Fondamentalmente, utilizzare il metodo staffa di accesso alle proprietà .

Risposto il 26/08/2016 a 01:56
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more