- 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.
Al desarrollar servidores con Node.js, a menudo nos vemos tentados por las innumerables ventajas de Spring.
Esto se debe a que es estructurado, sistemático y difícil de modificar arbitrariamente.
Por eso, en el entorno de Node.js, surgió el framework Nest.js.
Se trataba del deseo de muchos desarrolladores de poder desarrollar servidores al menos con una estructura tan organizada como la de Spring.
Sin embargo, la inyección de dependencias (DI) de Spring utiliza la reflexión en tiempo de ejecución para permitir la inyección de dependencias a nivel de lenguaje.
Dotnet también hace lo mismo, rastreando en base a atributos y realizando la inyección de dependencias mediante reflexión.
¿Entonces, cómo Nest.js puede realizar la inyección de dependencias?
Spring y Dotnet se basan en lenguajes compilados, por lo que la reflexión es compatible a nivel de lenguaje, pero...
…ecma script es simplemente un lenguaje interpretado, ¿no es así?
A continuación, se muestra uno de los ejemplos del tutorial de Nest.js.
Claramente, este código escrito en TypeScript, una vez compilado, no tendrá las etiquetas de tipo, y no sabrá el tipo de argumento necesario para el constructor de la clase.
La solución estaba en las especificaciones del lenguaje.
Reflect
Afortunadamente, existía una función creada a nivel de lenguaje para agregar metadatos a cada objeto.
Se trata de una función simple que simplemente agrega y obtiene metadatos de los objetos.
Entonces, TypeScript pensó:
¿Qué tal si añadimos la información de tipo a los metadatos al compilar las clases?
Por lo tanto, TypeScript almacena la información del tipo de los argumentos necesarios para el constructor de la clase en Reflect cada vez que se utiliza un decorador de clase.
Esto no implica ninguna transformación ni magia negra; es simplemente una función del compilador de TypeScript.
Si la información de tipo de los argumentos necesarios para el constructor se incluye en los metadatos de la clase,
podemos obtener el tipo al llamar a la clase y, por lo tanto, podemos inyectarlo directamente.
Se puede ver la implementación en NestJS, pero es demasiado extensa, así que recomiendo otra librería.
Como esta librería está desarrollada por Microsoft, el código es bastante limpio.
Recomiendo que la revisen y doy por finalizado este artículo.
Comentarios0