@decorator Decoradores
Última atualização: 2026-10-22
@decorator Decoradores
Um decorador é uma sintaxe especial (@name) colocada antes de classes, métodos, propriedades ou parâmetros: uma função de empacotamento que anexa comportamento (log, validação, injeção de dependência) a uma classe sem tocar no código dela. Decoradores ainda são experimentais no TypeScript e exigem experimentalDecorators no tsconfig; frameworks como NestJS e TypeORM dependem fortemente deles, o que os torna leitura obrigatória para essas bases de código.
| Grupo | Configuração e Prática |
|---|---|
| Tipo | Sintaxe |
| Modo strict | Não necessário |
ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.
📝 Sintaxe
// Decorator de classe: recebe o construtor
function sealed(Ctor: Function): void {
Object.seal(Ctor);
Object.seal(Ctor.prototype);
}
// Decorator de método: recebe (protótipo, nome do método, descritor de propriedade)
function logged(target: object, key: string, desc: PropertyDescriptor): void {
const original = desc.value;
desc.value = function (...args: unknown[]) {
console.log("call", key, args);
return original.apply(this, args);
};
}
@sealed
class Calculator {
@logged
add(a: number, b: number) { return a + b; }
}
⚙️ Parâmetros
| ClassDecorator | Recebe o construtor da classe; pode mutar a classe ou retornar uma substituta — usado para restrições de classe inteira como @sealed |
|---|---|
| MethodDecorator | Executa uma vez no momento da definição da classe; envolve o original reescrevendo desc.value, ou substitui o descritor inteiro pelo valor de retorno |
| experimentalDecorators | Flag do tsconfig; sem ela, decoradores são um erro de compilação. O ecossistema de frameworks (NestJS etc.) atualmente se baseia nesta versão experimental |
Retorno:Um decorador de classe pode retornar um novo construtor que substitui a classe original (ou nada, mantendo a original); um decorador de método pode retornar um novo property descriptor ou undefined, agindo apenas por efeitos colaterais.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
-> add(2, 3)
add = 5
-> mul(4, 5)
mul = 20
(Saída de execução após a transpilação; o decorador de método envolve no momento da definição da classe — cada chamada registra "-> add(2, 3)" antes de retornar o resultado)