Gibt es eine Möglichkeit Methoden im Fluge zu einer Klasse mit Typoskript hinzufügen?

stimmen
17

Ich versuche, eine Art von mixin Methode erstellen, die Methoden zum Prototyp / Klasse on the fly hinzufügen, aber ich bekomme Fehler wie

Die Eigenschaft ‚greetName‘ existiert nicht auf Wert vom Typ ‚Greeter‘ jeden

und

Die Eigenschaft ‚greetName‘ existiert nicht auf Wert vom Typ ‚Greeter‘ jeden

wenn ich den folgenden Code.

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 gültig js und läuft wie erwartet. Gibt es eine Möglichkeit, dies mit aus Compiler-Warnungen / Fehlern zu tun?

Veröffentlicht am 02/10/2012 um 22:49
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
15

Diese Lösung hat den Vorteil, geben Sie Typprüfung, wenn Sie dynamisch eine Methode hinzufügen:

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();
Beantwortet am 06/06/2013 um 17:02
quelle vom benutzer

stimmen
8

Es gibt einen anderen Weg, dies zu tun.

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

Funktioniert auf die gleiche und verwendet die Eigenschaft Indexer Funktion in Javascript und Typoskript beschwert sich nicht.

Beantwortet am 19/12/2012 um 16:06
quelle vom benutzer

stimmen
8

Sie würden dafür zur Arbeit ein Konzept der Teilklassen müssen die derzeit nicht unterstützt wird. Ich werde Ihnen sagen, dass das, was ich habe für diese Art von Szenarien funktioniert besser gefunden ist Schnittstellen zu verwenden, anstatt (ich habe jetzt für ca. 6 Monate in Typoskript worden Programmierung - ich bin bei MS aber nicht auf dem Typoskript Team)

Schnittstellen sind erweiterbar nach der Tat, indem Sie einfach die Methoden definging Sie an die Schnittstelle sind hinzufügen. Als Beispiel dafür, wenn Sie ein jQuery-Plugin installieren möchten Sie die IJQuery & IJQueryUtil Schnittstelle umfassen die Plugins zusätzliche Methoden neu zu definieren. Von diesem Zeitpunkt an können Sie die Plugins Methoden durch $ .plugin () und Typoskript werden gerne berufen.

Beantwortet am 02/10/2012 um 23:22
quelle vom benutzer

stimmen
1

Ähnliches Beispiel @Fenton, aber ohne die knorrigen Sachen:

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

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
Beantwortet am 26/05/2018 um 14:16
quelle vom benutzer

stimmen
0

Dies ist , wie RxJSfunktioniert 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 Modul Augmentation genannt.

Beantwortet am 23/10/2018 um 00:21
quelle vom benutzer

stimmen
0

Nach der dynamischen Methode und Eigenschaften auf Klassen zu implementieren, das war die Lösung ich in der Lage war, mit zu gehen Typoskript Compiler, um zu verhindern beschweren:

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

Grundsätzlich verwenden die Halterung Methode der Eigenschaftenaccessoren .

Beantwortet am 26/08/2016 um 01:56
quelle vom benutzer

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