- 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.
Podczas rozwoju serwera za pomocą Node.js, często kuszą nas liczne zalety Springa.
Dzieje się tak ze względu na jego strukturę, systematyczność i trudność w omijaniu jego mechanizmów.
Dlatego w środowisku Node.js powstał framework Nest.js.
To wynik licznych chęci tworzenia serwerów w strukturze zorganizowanej, podobnej do Springa.
Jednak DI w Springu wykorzystuje refleksję w czasie działania, aby umożliwić DI na poziomie języka.
Podobnie jest w Dotnet, gdzie DI jest realizowane za pomocą refleksji, w oparciu o atrybuty.
A jak Nest.js realizuje DI?
Spring i Dotnet opierają się na językach kompilowanych, które wspierają refleksję na poziomie języka,
ale ecma script to tylko... zwykły język interpretowany?
Poniżej znajduje się jeden z przykładów z tutoriala Nest.js.
Po skompilowaniu kod TypeScript, pozbawiony jest tagów typu, a konstruktor klasy nie będzie wiedział, jakiego typu są argumenty.
Rozwiązanie tkwi w specyfikacji języka.
Reflect
Na szczęście, istnieje funkcja pozwalająca dodawać metadane do obiektów na poziomie języka.
Jest to prosta funkcja dodawania i pobierania metadanych z obiektów.
Dlatego TypeScript pomyślał:
A co, gdyby podczas kompilacji klasy, informacje o typach były dodawane do metadanych?
Dlatego TypeScript, w miejscach, gdzie używane są dekoratory klas, przechowuje w Reflect informacje o typach argumentów potrzebnych do konstruktora.
Nie ma tu żadnych transformacji ani czarów, tylko funkcjonalność kompilatora TypeScript.
Jeśli w metadanych klasy znajdują się typy argumentów konstruktora,
to możemy je pobrać i użyć.
Implementację można znaleźć w NestJS, ale jest ona dość rozbudowana, dlatego polecam inną bibliotekę.
Biblioteka ta, stworzona przez Microsoft, charakteryzuje się czystym kodem.
Polecam ją do zapoznania się i na tym zakończę ten wpis.
Komentarze0