TypeScript 1.5 a maintenant des décorateurs .
Quelqu'un pourrait-il fournir un exemple simple démontrant la bonne façon d'implémenter un décorateur et décrire ce que signifient les arguments dans les signatures de décorateur valides possibles?
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;
De plus, y a-t-il des considérations de bonnes pratiques à garder à l'esprit lors de la mise en œuvre d'un décorateur?
typescript
decorator
David Sherret
la source
la source
@Injectable
dans un décorateur, référezRéponses:
J'ai fini par jouer avec les décorateurs et j'ai décidé de documenter ce que j'ai découvert pour quiconque veut en profiter avant que la documentation ne sorte. N'hésitez pas à le modifier si vous voyez des erreurs.
Points généraux
Décorateur Accessoire formel
Paramètres de mise en œuvre:
target
: Le prototype de la classe (Object
).propertyKey
: Le nom de la méthode (string
|symbol
).descriptor
: ATypedPropertyDescriptor
- Si vous n'êtes pas familier avec les clés d'un descripteur, je vous recommande de lire à ce sujet dans cette documentation surObject.defineProperty
(c'est le troisième paramètre).Exemple - sans arguments
Utilisation:
La mise en oeuvre:
Contribution:
Production:
Remarques:
this
ne sera pas celui de l'instance si vous le faites.@enumerable(false)
et@log
en même temps (Exemple: mauvais vs bon )TypedPropertyDescriptor
peut être utilisé pour restreindre les signatures de méthode ( exemple de méthode ) ou les signatures d'accesseur ( exemple d' accesseur ) sur lesquelles le décorateur peut être placé.Exemple - Avec arguments (Decorator Factory)
Lorsque vous utilisez des arguments, vous devez déclarer une fonction avec les paramètres du décorateur puis renvoyer une fonction avec la signature de l'exemple sans arguments.
Décorateur de méthode statique
Similaire à un décorateur de méthode avec quelques différences:
target
paramètre est la fonction constructeur elle-même et non le prototype.Décorateur de classe
Paramètre d'implémentation:
target
: La classe sur laquelle le décorateur est déclaré (TFunction extends Function
).Exemple d'utilisation : utilisation de l'API de métadonnées pour stocker des informations sur une classe.
Décorateur de propriété
Paramètres de mise en œuvre:
target
: Le prototype de la classe (Object
).propertyKey
: Le nom de la propriété (string
|symbol
).Exemple d'utilisation : création d'un
@serialize("serializedName")
décorateur et ajout du nom de la propriété à une liste de propriétés à sérialiser.Décorateur de paramètres
Paramètres de mise en œuvre:
target
: Le prototype de la classe (Function
—il sembleFunction
ne plus fonctionner. Vous devez utiliserany
ouObject
ici maintenant pour utiliser le décorateur dans n'importe quelle classe. Ou spécifier le (s) type (s) de classe auquel vous souhaitez le restreindre)propertyKey
: Le nom de la méthode (string
|symbol
).parameterIndex
: L'index du paramètre dans la liste des paramètres de la fonction (number
).Exemple simple
Exemple (s) détaillé (s)
la source
target
ou à quoiprototype of the class
etkey
fait référence.Une chose importante que je ne vois pas dans les autres réponses:
Usine de décorateur
Consultez le chapitre Décorateurs du manuel TypeScript .
la source
Vous pouvez implémenter quelque chose qui enregistre chaque appel à la console:
la source