Aula 18 - Decoradores e Metadados em TypeScript 🏷️
Objetivo Pedagógico
Objetivo: Construção de decoradores modernos (Stage 3 Decorators), anotação de classes, métodos e propriedades, e reflexão de metadados para frameworks orientados a injeção.
📑 1. Fundamentos Teóricos & Análise Técnica
Os Decoradores (Decorators) fornecem um mecanismo declarativo para inspecionar, modificar ou substituir a definição de classes, métodos, acessores e campos em TypeScript. Tradicionalmente utilizados em frameworks corporativos como Angular e NestJS através da flag experimental experimentalDecorators, os decoradores foram padronizados pela especificação do ECMAScript Stage 3, passando a ser suportados nativamente pelo TypeScript 5+.
A especificação Stage 3 adota uma assinatura limpa baseada em funções que recebem o valor alvo e um objeto de contexto (ClassMethodDecoratorContext, ClassFieldDecoratorContext), permitindo: 1. Auditoria e Profiling de Performance: Medição transparente do tempo de execução de métodos sem alterar sua lógica interna. 2. Anotação Declarativa de Rotas: Registro de metadados como @Get('/usuarios') ou @Post('/pedidos') em classes controladoras. 3. Reflexão com reflect-metadata: Associação de metadados invisíveis às classes para resolução automatizada em contêineres de Inversão de Controle (IoC).
📐 Arquitetura Conceitual & Diagrama de Fluxo
sequenceDiagram
autonumber
actor Client as Chamada do Método
participant Decorator as Decorador @LogExecutionTime
participant Method as Método Original da Classe
participant Timer as Sistema de Telemetria
Client->>Decorator: Dispara Execução
Decorator->>Timer: Marca performance.now() Inicial
Decorator->>Method: Invoca Método com Argumentos
Method-->>Decorator: Retorna Resultado
Decorator->>Timer: Calcula Duração Decorrida
Decorator->>Client: Retorna Resultado e Registra Log de Telemetria 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Padrão ECMAScript Stage 3: Compatibilidade futura total com a plataforma web nativa sem dependência de flags legadas. - Separação de Preocupações Transversais (Cross-Cutting Concerns): Logging, segurança e cache isolados em decoradores reutilizáveis. - Objeto Contextual Padronizado: Acesso seguro ao nome do membro, tipo de elemento e ganchos de inicialização (addInitializer). - Imutabilidade de Estrutura: Modificação transparente de comportamento sem reescrever o código do desenvolvedor.
🛠️ 2. Implementação Prática em TypeScript Decorators e Reflect Metadata
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// log-decorator.ts (Decorador de Método Stage 3)
// Decorador de Método em Conformidade com ECMAScript Stage 3
export function LogExecutionTime() {
return function <This, Args extends any[], Return>(
target: (this: This, ...args: Args) => Return,
context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>
) {
const methodName = String(context.name);
return function (this: This, ...args: Args): Return {
const start = performance.now();
const result = target.apply(this, args);
const duration = (performance.now() - start).toFixed(2);
console.log(`[Telemetria] ${methodName} executado em ${duration}ms`);
return result;
};
};
}
// Exemplo de Aplicação
export class BillingService {
@LogExecutionTime()
processInvoice(amount: number): boolean {
// Simula processamento pesado
for (let i = 0; i < 1_000_000; i++) {}
return amount > 0;
}
}
💡 Análise Passo a Passo do Código
- Assinatura Tipada: O decorador preserva os tipos de argumentos (
Args) e retorno (Return) da função original. - Captura de Contexto:
context.namefornece o nome exato do método sem necessidade de reflexão manual. - Execução Transparente:
target.apply(this, args)garante que o escopo da instância da classe (this) permaneça intacto.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto