TypeScript 1.5 ahora tiene decoradores .
¿Podría alguien proporcionar un ejemplo simple que demuestre la forma correcta de implementar un decorador y describir lo que significan los argumentos en las posibles firmas de decorador válidas?
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;
Además, ¿hay algunas consideraciones de mejores prácticas que se deben tener en cuenta al implementar un decorador?
typescript
decorator
David Sherret
fuente
fuente
@Injectable
en un decorador, consulteRespuestas:
Terminé jugando con decoradores y decidí documentar lo que descubrí para cualquiera que quiera aprovechar esto antes de que salga la documentación. Siéntase libre de editar esto si ve algún error.
Puntos generales
Método / Decorador de accesorios formal
Parámetros de implementación:
target
: El prototipo de la clase (Object
).propertyKey
: El nombre del método (string
|symbol
).descriptor
: ATypedPropertyDescriptor
- Si no está familiarizado con las claves de un descriptor, recomendaría leerlo en esta documentación sobreObject.defineProperty
(es el tercer parámetro).Ejemplo: sin argumentos
Utilizar:
Implementación:
Entrada:
Salida:
Notas:
this
no será la instancia si lo hace.@enumerable(false)
y@log
al mismo tiempo (Ejemplo: Malo vs Bueno )TypedPropertyDescriptor
se puede usar para restringir las firmas de métodos ( Ejemplo de método ) o las firmas de acceso ( Ejemplo de acceso ) en que se puede poner el decorador.Ejemplo - Con argumentos (Fábrica de decoradores)
Al usar argumentos, debe declarar una función con los parámetros del decorador y luego devolver una función con la firma del ejemplo sin argumentos.
Decorador de métodos estáticos
Similar a un decorador de métodos con algunas diferencias:
target
parámetro es la función constructora en sí y no el prototipo.Decorador de clase
Parámetro de implementación:
target
: La clase en la que se declara el decorador (TFunction extends Function
).Ejemplo de uso : uso de la API de metadatos para almacenar información en una clase.
Decorador de propiedades
Parámetros de implementación:
target
: El prototipo de la clase (Object
).propertyKey
: El nombre de la propiedad (string
|symbol
).Ejemplo de uso : crear un
@serialize("serializedName")
decorador y agregar el nombre de la propiedad a una lista de propiedades para serializar.Decorador de parámetros
Parámetros de implementación:
target
: El prototipo de la clase (Function
- parece queFunction
ya no funciona. Debería usarany
oObject
aquí ahora para usar el decorador dentro de cualquier clase. O especificar el tipo de clase a la que desea restringirlo)propertyKey
: El nombre del método (string
|symbol
).parameterIndex
: El índice del parámetro en la lista de parámetros de la función (number
).Ejemplo simple
Ejemplo (s) detallado (s)
fuente
target
o alprototype of the class
y sekey
refiere, ¿podría alguien explicarme eso?Una cosa importante que no veo en las otras respuestas:
Fábrica de decoradores
Consulte el capítulo Decoradores del manual de TypeScript .
fuente
Podría implementar algo que registre cada llamada a la consola:
fuente