C'è un modo per aggiungere metodi al volo a una classe usando dattiloscritto?

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

  •  12-12-2019
  •  | 
  •  

Domanda

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

.

La proprietà 'GreeName' non esiste sul valore del tipo 'Greeter' qualsiasi

e

.

La proprietà 'GreeName' non esiste sul valore del tipo 'Greeter' qualsiasi

Quando eseguo 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'));
.

Compila effettivamente il JS valido e funziona come previsto.C'è un modo per farlo senza avvertenze / errori del compilatore?

È stato utile?

Soluzione

Questa soluzione ha il vantaggio di darti il controllo del tipo quando aggiungi 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();
.

Altri suggerimenti

Avrebbero bisogno di un concetto di classi parziali per questo lavoro che al momento non è supportato.Ti dirò che ciò che ho trovato funziona meglio per questi tipi di scenari è usare invece interfacce (ho programmato in dittivetti per circa 6 mesi ora - sono in ms ma non sul team di dattiloscritto) .

Le interfacce sono estendibili dopo il fatto semplicemente defendo i metodi che stai aggiungendo all'interfaccia.Come esempio di questo, se si installa un plugin jQuery, ti consigliamo di definire l'interfaccia ijquery & ijqueryutil per includere i plug-in aggiuntivi.Da quel punto in avanti è possibile invocare i metodi dei plugin attraverso $ .plugin () e dattiloscritto sarà felice.

C'è un altro modo per farlo.

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

Funziona lo stesso e utilizza la funzione Indexer Property In JavaScript e dattiloscritto non si lamenta.

Simile all'esempio @fenton, ma senza la roba Gnarly:

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

interface MyClass {
    stop(): void;
}

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

Ecco come RxJS lo 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 aumenti del modulo.

Dopo aver dovuto implementare metodi e proprietà dinamici sulle classi, questa è stata la soluzione che sono stato in grado di andare a prevenire il compito di compito da scrivere:

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

Fondamentalmente, utilizzare il metodo della staffa di Accessori di proprietà .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top