Metadados de Decoradores
Anexe e leia metadados com a API de metadados.
Metadados de Decoradores é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de TypeScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de TypeScript Academy inclui 4 aulas no total.
A API de Metadados dos Decoradores
Os decoradores padronizados incluem um canal integrado de metadados. O objeto de contexto expõe um objeto metadata no qual você pode gravar, e a classe posteriormente o carrega sob a conhecida chave Symbol.metadata.
context.metadata
Cada contexto de decorador compartilha um único objeto metadata para a classe que está sendo definida. Os decoradores anexam dados a ele; ele se torna os metadados da classe.
function tag(label: string) {
return function (value: any, context: DecoratorContext) {
context.metadata[context.name] = label;
};
}Leitura via Symbol.metadata
Depois que a classe é definida, os metadados coletados ficam disponíveis em SomeClass[Symbol.metadata].
class User {
@tag("identifier") id = 0;
@tag("display") name = "";
}
const meta = (User as any)[Symbol.metadata];
console.log(meta); // { id: "identifier", name: "display" }Por que um objeto compartilhado
Como todos os decoradores de uma classe gravam no mesmo objeto metadata, você pode acumular informações de vários decoradores em um único registro coerente que descreve a classe.
Armazenando metadados estruturados
Os valores dos metadados podem ter qualquer formato. Um padrão comum é manter um registro aninhado indexado pelo nome do membro.
function column(type: string) {
return function (value: any, context: ClassFieldDecoratorContext) {
const md = context.metadata as any;
md.columns ??= {};
md.columns[context.name] = { type };
};
}Metadados no nível da classe
Um decorador de classe também pode gravar metadados, por exemplo, o nome de uma tabela que complementa as informações de coluna de cada campo.
function entity(table: string) {
return function (value: Function, context: ClassDecoratorContext) {
(context.metadata as any).table = table;
};
}
@entity("users")
class UserEntity {
@column("serial") id = 0;
@column("text") name = "";
}Herança de metadados
Os objetos de metadados são vinculados ao longo da cadeia de protótipos: o objeto de metadados de uma subclasse tem os metadados do pai como seu protótipo, portanto as entradas herdadas ficam visíveis, a menos que sejam sobrescritas.
Polyfill de Symbol.metadata
Symbol.metadata é um símbolo conhecido. Em ambientes que não o possuem, você atribui um polyfill para que o ambiente de execução possa anexar o objeto coletado.
(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");Metadados sem reflect-metadata
Essa API faz parte da própria proposta de decoradores, portanto não exige a biblioteca separada de metadados de reflexão. Essa biblioteca continua relevante apenas para a emissão experimental mais antiga de tipos de design (na próxima lição).
Um auxiliar prático de leitura
Um pequeno acessador centraliza a leitura dos metadados de qualquer classe, retornando um objeto vazio quando não há metadados.
function getMeta(cls: any): Record<string, any> {
return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}Por que isso é importante
Os metadados transformam os decoradores, que deixam de ser simples envoltórios de comportamento pontual e passam a ser uma descrição declarativa das suas classes. As estruturas leem essa descrição para criar ORMs, validadores e roteadores sem soluções improvisadas de reflexão em tempo de execução.
Verificação rápida
Confirme sua compreensão da API de metadados.
Recapitulação
A API de metadados dos decoradores fornece a cada decorador um objeto context.metadata compartilhado, exposto na classe por meio de Symbol.metadata. Os decoradores acumulam metadados estruturados e herdáveis sem uma biblioteca externa, permitindo descrições de classes declarativas e adequadas para estruturas.
Perguntas Frequentes
A aula “Metadados de Decoradores” é grátis?
Sim — o texto completo de “Metadados de Decoradores” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de TypeScript Academy, atualize para CoddyKit PRO. O curso de TypeScript Academy inclui 4 aulas no total.
O que vou aprender em “Metadados de Decoradores”?
Anexe e leia metadados com a API de metadados. Você pratica TypeScript Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar TypeScript Academy?
Nenhuma experiência prévia é necessária. TypeScript Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Metadados de Decoradores”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de TypeScript Academy?
Sim. Cada aula de TypeScript Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Decoradores da Etapa 3 Explicados
- Metadados de Decoradores
- reflect-metadata e Tipos de Design
- Construindo uma Estrutura de Decoradores