C'è un modo per aggiungere metodi al volo a una classe usando dattiloscritto?
-
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?
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à .