O TypeScript 1.5 agora possui decoradores .
Alguém poderia fornecer um exemplo simples demonstrando a maneira correta de implementar um decorador e descrever o que significam os argumentos nas possíveis assinaturas válidas do decorador?
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;
Além disso, existem considerações sobre as melhores práticas que devem ser lembradas ao implementar um decorador?
typescript
decorator
David Sherret
fonte
fonte
@Injectable
em um decorador, consulte #Respostas:
Acabei brincando com os decoradores e decidi documentar o que descobri para quem quiser tirar vantagem disso antes que a documentação seja publicada. Sinta-se à vontade para editar isso se houver algum erro.
Pontos Gerais
Método / Decorador formal de acessador
Parâmetros de implementação:
target
: O protótipo da classe (Object
).propertyKey
: O nome do método (string
|symbol
).descriptor
: ATypedPropertyDescriptor
- Se você não estiver familiarizado com as chaves de um descritor, recomendo ler sobre isso nesta documentação emObject.defineProperty
(é o terceiro parâmetro).Exemplo - sem argumentos
Usar:
Implementação:
Entrada:
Resultado:
Notas:
this
não será da instância se você o fizer.@enumerable(false)
e@log
ao mesmo tempo (Exemplo: Ruim vs Bom )TypedPropertyDescriptor
pode ser usado para restringir quais assinaturas de método ( Exemplo de Método ) ou assinantes de acessador ( Exemplo de Acessor ) no qual o decorador pode ser colocado.Exemplo - Com argumentos (Decorator Factory)
Ao usar argumentos, você deve declarar uma função com os parâmetros do decorador e retornar uma função com a assinatura do exemplo sem argumentos.
Decorador de método estático
Semelhante a um decorador de métodos com algumas diferenças:
target
parâmetro é a própria função construtora e não o protótipo.Class Decorator
Parâmetro de implementação:
target
: A classe em que o decorador é declarado (TFunction extends Function
).Exemplo de uso : usando a API de metadados para armazenar informações em uma classe.
Decorador de propriedades
Parâmetros de implementação:
target
: O protótipo da classe (Object
).propertyKey
: O nome da propriedade (string
|symbol
).Exemplo de uso : Criando um
@serialize("serializedName")
decorador e adicionando o nome da propriedade a uma lista de propriedades para serializar.Decorador de Parâmetros
Parâmetros de implementação:
target
: O protótipo da classe (Function
- pareceFunction
que não funciona mais. Você deve usarany
ouObject
aqui agora para usar o decorador em qualquer classe. Ou especificar o (s) tipo (s) de classe ao qual você deseja restringir)propertyKey
: O nome do método (string
|symbol
).parameterIndex
: O índice do parâmetro na lista de parâmetros da função (number
).Exemplo simples
Exemplo (s) Detalhado (s)
fonte
target
ou oprototype of the class
ekey
se refere, alguém poderia por favor elaborar sobre isso?Uma coisa importante que não vejo nas outras respostas:
Fábrica de decorador
Consulte o capítulo Decoradores do manual do TypeScript .
fonte
Você pode implementar algo que registra cada chamada no console:
fonte