2017-12-17 8 views
2

Normalerweise wende ich den Dekorateur wie folgt aus:kann ich Dekoratoren für Objekteigenschaften verwenden?

class SpecialMethods { 
    @Deco 
    static someMethod() { 
    } 
} 

Gibt es auch eine Möglichkeit, es mit einem einfachen Objekt zu verwenden, anstatt eine Klasse:

const SpecialMethods = { 
    @Deco 
    someMethod:() => {} 
} 
+1

Auf welche Dekorateure beziehen Sie sich? Die Vorschläge? –

+1

Was ist eine abstrakte Klasse? Dies sieht nicht wie JavaScript aus. – Bergi

+0

@Bergi Sorry, ich arbeite gerade viel mit Typoskript. Ich habe die Zusammenfassung entfernt – Chris

Antwort

0

Ja, aber es ist nicht sehr praktisch. Sie können den Decorator für die Eigenschaften eines Objekts aufrufen, jedoch nicht auf die gleiche Weise, wie Sie eine Klasse und deren Inhalt dekorieren würden.

Angesichts der folgende Dekorateur:

const TestDecorator = (at: string) => { 
    return function (target: any, prop: string, descriptor?: PropertyDescriptor) { 
     console.log(`decorated at ${at}}`); 
    } 
} 

würde verwendet werden, wie es in einer Klasse gefolgt:

class TestClass { 
    @TestDecorator('class method') 
    public testMethod() { } 
} 

Es kann jedoch nicht die gleiche Art und Weise für eine Eigenschaft, wie oben angewandt werden:

Um dies zu umgehen, können Sie den Dekorateur in der Eigenschaft aufrufen.

Zuerst müssen Sie Ihr Objekt mit all seinen Eigenschaften erklären:

const testObj = { 
    testMethod:() => { } 
}; 

Mein Dekorateur erwartet einen curried Wert:

const deco = TestDecorator('property method'); 

Jetzt müssen Sie manuell die deco Dekorateur für die Eigenschaft aufrufen in :

deco(testObj, 'testMethod'); 

Wenn Sie müssen die propertyDescriptor in Ihrem Dekorateur (nicht im OP ist), werden Sie müssen es manuell bieten auch:

deco(testObj, 'testMethod', Object.getOwnPropertyDescriptor(testObj, 'testMethod')); 

hier ein TS playground ist. Überprüfen Sie die Ausgabe in der Konsole.

+0

Warum übergeben Sie nicht einen Eigenschaftsdeskriptor? – Bergi

+0

@Bergi Das ist in diesem Beispiel nicht nötig. Dies zeigt nur, wie man einen Dekorator für ein "Objekt" aufruft, ich manipuliere nichts von innerhalb des Dekorators. –

+0

Nun ja, aber es hängt sehr davon ab, was der eigentliche Dekorateur des OPs tut, also wäre es gut, eine allgemeine Lösung zu geben oder zumindest zu sagen, dass es nur ein reduziertes Beispiel ist. – Bergi

Verwandte Themen