- 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.
Node.js-sel szerverfejlesztés során számos alkalommal megkísérthet a Spring használata.
Szerkezettségének, rendszerszerűségének és a nehézkes „kiszabadulásnak” köszönhetően.
Ezért jelent meg a Node.js környezetben a Nest.js keretrendszer.
Sokan kívánták a Springhez hasonlóan strukturált módon fejleszteni a szervert.
A Spring DI futásidejű reflexiót használ a DI nyelvi szintű végrehajtásához.
A Dotnet is hasonlóképpen attribútumokon alapuló követést használ a reflexióval történő DI végrehajtásához.
Hogyan valósítja meg a Nest.js a DI-t?
A Spring és a Dotnet alapjául szolgáló nyelvek fordító nyelvek, ezért a nyelvi szinten támogatják a reflexiót,
de az ecma script csupán... egy értelmező nyelvű egyszerű halandó?
Az alábbiakban a Nest.js oktatóanyagában található példák egyike látható.
Ez a TypeScript-ben írt kód a fordítás után nyilvánvalóan már nem tartalmazza a típuscímkéket, és a konstruktor nem ismeri a szükséges argumentum típusát.
A megoldás a nyelvi specifikációban rejlett.
Reflect
Szerencsére létezett egy olyan nyelvi szintű funkció, amely lehetővé teszi metaadatok hozzáadását az objektumokhoz.
Ez egy egyszerű funkció, amely metaadatokat ad hozzá és olvas ki az objektumokból.
A TypeScript tehát ezt gondolta:
Mi lenne, ha a fordítás során a típusinformációkat metaadatokként tárolnánk?
A TypeScript tehát minden osztálydekorátor esetén a szükséges argumentumok típusát tárolja a Reflect-ben.
Ehhez nem szükséges semmilyen transzformáció vagy fekete mágia, pusztán a TypeScript fordító funkciója.
Ha az osztály metaadataiban szerepelnek a konstruktor szükséges argumentumainak típusai,
akkor az osztály betöltésekor ismerjük a típusokat, és megfelelően beállíthatjuk őket.
A megvalósítás megtekinthető a NestJS-ben is, de ez túl terjedelmes, ezért egy másik könyvtárat ajánlok.
A Microsoft által készített könyvtár kódja meglehetősen tiszta.
Ajánlom, hogy nézze meg, és ezzel befejezem a cikket.
Hozzászólások0