Gibt es eine Möglichkeit, einer Klasse mithilfe von Typescript Methoden im laufenden Betrieb hinzuzufügen?
-
12-12-2019 - |
Frage
Ich versuche, eine Art Mixin-Methode zu erstellen, die dem Prototyp / der Klasse im laufenden Betrieb Methoden hinzufügt, aber ich erhalte Fehler wie
Die Eigenschaft 'greetName' existiert nicht für den Wert vom Typ 'Greeter' jeder
und
Die Eigenschaft 'greetName' existiert nicht für den Wert vom Typ 'Greeter' jeder
wenn ich den folgenden Code ausführe.
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'));
Es kompiliert tatsächlich zu gültigem js und läuft wie erwartet.Gibt es eine Möglichkeit, dies ohne Compiler-Warnungen / -Fehler zu tun?
Lösung
Diese Lösung hat den Vorteil, dass Sie ein Typ überprüfen, wenn Sie eine Methode dynamisch hinzufügen:
generasacodicetagpre.Andere Tipps
Sie benötigen ein Konzept von Teilklassen, damit diese zur Arbeit, die derzeit nicht unterstützt wird.Ich erzähle Ihnen, dass das, was ich gefunden habe, besser für diese Arten von Szenarien, die für diese Arten von Szenarien besser funktionieren, ist, stattdessen Schnittstellen zu verwenden (ich habe in typecript seit ungefähr 6 Monaten programmiert - ich bin bei MS aber nicht auf dem Typenkript-Team)
Schnittstellen sind nach der Tatsache erweiterbar, indem Sie einfach die Methoden dekorieren, die Sie an die Schnittstelle hinzufügen.Wenn Sie beispielsweise ein JQuery-Plugin installieren, möchten Sie die Benutzeroberfläche von ijquery & ijqueryutil neu definieren, um die Plugins zusätzliche Methoden aufzunehmen.Von diesem Punkt nach vorne können Sie die Plugins-Methoden über $ .plugin () und Tastercript aufrufen.
Es gibt einen anderen Weg, dies zu tun.
generasacodicetagpre.funktioniert dasselbe und verwendet die Eigenschaft Indexer-Funktion in JavaScript und Mastercript ist nicht beschwert.
ähnlich wie @Fenton-Beispiel, aber ohne das gnarly Sachen:
generasacodicetagpre.Dies ist, wie RxJS
tut es
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) {
}
Dies wird Modulaugmentation genannt.
Nachdem er dynamische Methoden und Eigenschaften auf Klassen implementieren musste, war dies die Lösung, mit der ich ein Typencript-Compiler verhindern konnte:
generasacodicetagpre.Grundsätzlich verwenden Sie die Klammermethode von Immobilienerschläge .