Gibt es eine Möglichkeit, einer Klasse mithilfe von Typescript Methoden im laufenden Betrieb hinzuzufügen?

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

  •  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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top