TypeScript 1.5 hat jetzt Dekoratoren .
Könnte jemand ein einfaches Beispiel liefern, das die richtige Art der Implementierung eines Dekorateurs demonstriert und beschreibt, was die Argumente in den möglichen gültigen Dekorationssignaturen bedeuten?
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
declare type ParameterDecorator = (target: Function, propertyKey: string | symbol, parameterIndex: number) => void;
Gibt es außerdem Best-Practice-Überlegungen, die bei der Implementierung eines Dekorateurs berücksichtigt werden sollten?
typescript
decorator
David Sherret
quelle
quelle
@Injectable
in einen Dekorateur injizieren möchten , beziehen Sie sich aufAntworten:
Am Ende habe ich mit Dekorateuren herumgespielt und beschlossen, zu dokumentieren, was ich für jeden herausgefunden habe, der dies nutzen möchte, bevor eine Dokumentation herauskommt. Bitte zögern Sie nicht, dies zu bearbeiten, wenn Sie Fehler sehen.
Allgemeine Punkte
Method / Formal Accessor Decorator
Implementierungsparameter:
target
: Der Prototyp der Klasse (Object
).propertyKey
: Der Name der Methode (string
|symbol
).descriptor
: ATypedPropertyDescriptor
- Wenn Sie mit den Schlüsseln eines Deskriptors nicht vertraut sind, würde ich empfehlen, darüber in dieser Dokumentation zu lesenObject.defineProperty
(dies ist der dritte Parameter).Beispiel - Ohne Argumente
Verwenden:
Implementierung:
Eingang:
Ausgabe:
Anmerkungen:
this
wird nicht der der Instanz sein, wenn Sie dies tun.@enumerable(false)
und@log
gleichzeitig verwenden (Beispiel: Schlecht gegen Gut )TypedPropertyDescriptor
können Sie einschränken, auf welche Methodensignaturen ( Methodenbeispiel ) oder Accessorsignaturen ( Accessor-Beispiel ) der Dekorator angewendet werden kann.Beispiel - Mit Argumenten (Decorator Factory)
Wenn Sie Argumente verwenden, müssen Sie eine Funktion mit den Parametern des Dekorateurs deklarieren und dann eine Funktion mit der Signatur des Beispiels ohne Argumente zurückgeben.
Static Method Decorator
Ähnlich einem Methodendekorateur mit einigen Unterschieden:
target
Parameter ist die Konstruktorfunktion selbst und nicht der Prototyp.Klassendekorateur
Implementierungsparameter:
target
: Die Klasse, für die der Dekorateur deklariert ist (TFunction extends Function
).Anwendungsbeispiel : Verwenden der Metadaten-API zum Speichern von Informationen zu einer Klasse.
Property Decorator
Implementierungsparameter:
target
: Der Prototyp der Klasse (Object
).propertyKey
: Der Name der Eigenschaft (string
|symbol
).Anwendungsbeispiel : Erstellen eines
@serialize("serializedName")
Dekorators und Hinzufügen des Eigenschaftsnamens zu einer Liste der zu serialisierenden Eigenschaften.Parameter Decorator
Implementierungsparameter:
target
: Der Prototyp der Klasse (Function
- es scheintFunction
nicht mehr zu funktionieren. Sie solltenany
oderObject
hier jetzt verwenden, um den Dekorator in einer Klasse zu verwenden. Oder geben Sie die Klassentypen an, auf die Sie ihn einschränken möchten.)propertyKey
: Der Name der Methode (string
|symbol
).parameterIndex
: Der Parameterindex in der Liste der Funktionsparameter (number
).Einfaches Beispiel
Detaillierte Beispiele
quelle
target
oder wasprototype of the class
undkey
bezieht sich darauf. Könnte jemand bitte näher darauf eingehen?Eine wichtige Sache sehe ich in den anderen Antworten nicht:
Dekorateur Fabrik
Lesen Sie das Kapitel TypeScript-Handbuch Dekorateure .
quelle
Sie können etwas implementieren, das jeden Aufruf an die Konsole protokolliert:
quelle