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

@Injectableen 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:
thisno será la instancia si lo hace.@enumerable(false)y@logal mismo tiempo (Ejemplo: Malo vs Bueno )TypedPropertyDescriptorse 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:
targetpará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 queFunctionya no funciona. Debería usaranyoObjectaquí 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
targeto alprototype of the classy sekeyrefiere, ¿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