- Reflect - JavaScript | MDN
- The Reflect namespace object contains static methods for invoking interceptable JavaScript object internal methods. The methods are the same as those of proxy handlers.
Ao desenvolver servidores com Node.js, muitas vezes somos tentados pelas inúmeras vantagens do Spring.
Devido à sua estrutura organizada, sistemática e à dificuldade de se desviar de sua arquitetura.
Por isso, no ecossistema Node.js, surgiu o framework Nest.js.
Muitos programadores desejavam, pelo menos, desenvolver servidores em uma estrutura organizada, semelhante ao Spring.
No entanto, a injeção de dependências (DI) do Spring utiliza reflexão em tempo de execução para permitir a injeção de dependências em nível de linguagem.
O Dotnet também faz o mesmo, rastreando com base em atributos e usando reflexão para realizar a injeção de dependências.
Então, como o Nest.js consegue realizar a injeção de dependências?
O Spring e o Dotnet são baseados em linguagens compiladas, que oferecem suporte à reflexão em nível de linguagem, mas...
o EcmaScript é apenas uma linguagem interpretada comum, não é?
Abaixo está um exemplo do tutorial do Nest.js.
Certamente, este código TypeScript, após a compilação, terá suas tags de tipo removidas, e não saberá os tipos de argumento necessários para o construtor da classe.
A solução estava na especificação da linguagem.
Reflect
Felizmente, havia um recurso em nível de linguagem que permitia adicionar metadados a cada objeto.
É uma função simples que apenas adiciona e recupera metadados de objetos.
Então, o TypeScript pensou:
E se adicionarmos as informações de tipo aos metadados ao compilar as classes?
Portanto, o TypeScript, sempre que um decorador de classe é usado, armazena as informações sobre os argumentos necessários para o construtor da classe no Reflect.
Isso não envolve nenhuma transformação ou magia negra; é apenas um recurso do compilador TypeScript.
Dessa forma, com as informações de tipo dos argumentos necessários para o construtor incluídas nos metadados da classe,
podemos recuperá-las e usá-las.
Você pode verificar a implementação no NestJS, mas como é bastante extensa, recomendo outra biblioteca.
Como esta biblioteca é da Microsoft, o código é bastante limpo.
Recomendo que você dê uma olhada. Com isso, concluo este artigo.
Comentários0