- 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.
Lors du développement de serveurs avec Node.js, on est souvent tenté par les nombreuses possibilités offertes par Spring.
En raison de sa structure, de son organisation systématique et de la difficulté à le contourner.
C'est pourquoi, dans l'environnement Node.js, le framework Nest.js a été créé.
Il s'agissait d'un fort désir de pouvoir développer des serveurs dans une structure organisée, à l'image de Spring.
Cependant, l'injection de dépendances (DI) de Spring utilise la réflexion au moment de l'exécution pour permettre la réalisation de l'injection de dépendances au niveau du langage.
Dotnet fait de même, en utilisant des attributs pour suivre et effectuer l'injection de dépendances par réflexion.
Alors, comment Nest.js réalise-t-il l'injection de dépendances ?
Spring et Dotnet sont basés sur des langages compilés, qui prennent en charge la réflexion au niveau du langage, mais...
ecma script n'est qu'un langage interprété ordinaire, n'est-ce pas ?
Voici un exemple tiré d'un tutoriel Nest.js.
Ce code TypeScript, une fois compilé, sera certainement dépourvu de balises de type, et le type des arguments nécessaires au constructeur de la classe sera inconnu.
La solution se trouvait dans les spécifications du langage.
Reflect
Heureusement, une fonctionnalité permettant d'ajouter des métadonnées à chaque objet a été créée au niveau du langage.
Il s'agit simplement d'une fonctionnalité simple d'ajout et de récupération de métadonnées pour les objets.
TypeScript a donc réfléchi :
Et si on ajoutait les informations de type aux métadonnées lors de la compilation des classes ?
TypeScript enregistre donc les informations sur les arguments nécessaires au constructeur de la classe dans Reflect à chaque fois qu'un décorateur de classe est utilisé.
Aucune transformation ou magie noire n'est impliquée ici, il s'agit uniquement d'une fonctionnalité du compilateur TypeScript.
Une fois que les types des arguments nécessaires au constructeur sont inclus dans les métadonnées de la classe,
nous pouvons récupérer la classe et connaître son type, et donc l'utiliser.
Vous pouvez examiner l'implémentation dans NestJS, mais cela est trop long, je vous recommande donc une autre librairie.
Cette librairie, étant développée par Microsoft, a un code assez propre.
Je vous recommande de la consulter, et je terminerai ici cet article.
Commentaires0