reflect-metadata e Tipos de Design
Capture tipos de parâmetros e propriedades em tempo de execução.
reflect-metadata e Tipos de Design é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 3 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.
Metadados de reflexão e tipos de design
Antes da existência de metadados padronizados, o TypeScript podia emitir informações de tipo em tempo de design em tempo de execução por meio da biblioteca reflect-metadata e da opção do compilador emitDecoratorMetadata. Esta lição aborda esse mecanismo mais antigo, mas ainda amplamente usado.
Ativando o recurso
Duas coisas são necessárias: ativar as opções do compilador e importar a biblioteca uma vez no ponto de entrada do programa.
// tsconfig.json
// {
// "compilerOptions": {
// "experimentalDecorators": true,
// "emitDecoratorMetadata": true
// }
// }
import "reflect-metadata";O que é emitido
Com emitDecoratorMetadata, o compilador emite três chaves para membros decorados: design:type, design:paramtypes e design:returntype. Os valores são as funções construtoras, como String e Number.
Lendo design:type
Para uma propriedade decorada, Reflect.getMetadata("design:type", target, key) retorna o construtor do tipo da propriedade.
import "reflect-metadata";
function track(target: any, key: string) {
const t = Reflect.getMetadata("design:type", target, key);
console.log(key, "->", t.name); // e.g. "name -> String"
}
class Person {
@track name!: string;
@track age!: number;
}Lendo design:paramtypes
Em um construtor ou método, design:paramtypes é uma matriz dos construtores dos tipos dos parâmetros, a base da injeção de dependências.
function injectable(target: any) {
const params = Reflect.getMetadata("design:paramtypes", target);
console.log(params.map((p: any) => p.name)); // ["Database", "Logger"]
}
@injectable
class Service {
constructor(private db: Database, private log: Logger) {}
}Limitações dos tipos emitidos
Apenas tipos simples e representáveis em tempo de execução sobrevivem. Interfaces, uniões e genéricos são reduzidos a Object, pois não têm um construtor em tempo de execução. Os tipos de design são aproximados, não correspondem ao tipo completo do TS.
Metadados personalizados com Reflect
Você também pode definir suas próprias chaves de metadados com Reflect.defineMetadata, independentemente dos tipos de design.
import "reflect-metadata";
function required(target: any, key: string) {
Reflect.defineMetadata("required", true, target, key);
}
function isRequired(target: any, key: string) {
return Reflect.getMetadata("required", target, key) === true;
}Onde é usado
Esse mecanismo é usado por muitas estruturas consolidadas, como NestJS, TypeORM e validador de classe. Elas leem design:type e design:paramtypes para conectar dependências e validar valores sem que você precise repetir os tipos.
Metadados de reflexão versus metadados padrão
A nova API Symbol.metadata faz parte da linguagem e não emite tipos de design. reflect-metadata fornece exclusivamente informações de tipo, mas está vinculada ao modo experimental de decoradores. Escolha um único modelo por projeto.
A ordem das importações é importante
import "reflect-metadata" deve ser executado uma vez, antes de qualquer classe decorada ser avaliada, pois altera o objeto global Reflect com as funções de metadados. Importe-o no início do seu arquivo de entrada.
Por que isso é importante
A emissão de tipos de design permite que as estruturas preencham a lacuna entre os tipos em tempo de compilação e o comportamento em tempo de execução, o que viabiliza a DI e a validação de forma prática. Conhecer suas limitações, como a ausência de interfaces e genéricos, evita resultados surpreendentes com Object.
Verificação rápida
Teste sua compreensão de reflect-metadata.
Recapitulação
Com experimentalDecorators + emitDecoratorMetadata e um import "reflect-metadata" antecipado, o compilador emite design:type e design:paramtypes como construtores em tempo de execução. As estruturas os leem para DI e validação, embora interfaces, uniões e genéricos sejam reduzidos a Object.
Aprenda TypeScript com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 101
- Aulas
- 352
Perguntas Frequentes
A aula “reflect-metadata e Tipos de Design” é grátis?
Sim — o texto completo de “reflect-metadata e Tipos de Design” é 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 “reflect-metadata e Tipos de Design”?
Capture tipos de parâmetros e propriedades em tempo de execução. 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 3 de 4.
Quanto tempo leva a aula “reflect-metadata e Tipos de Design”?
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