- 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.
Bij het ontwikkelen van servers met Node.js, wordt men vaak verleid door de vele mogelijkheden van Spring.
Dit komt door de gestructureerde en systematische opbouw, en het feit dat het moeilijk is om er zomaar van af te wijken.
Daarom is in het Node.js-kamp het framework Nest.js ontstaan.
De wens om serverontwikkeling te doen in een gestructureerde vorm, vergelijkbaar met Spring, was de drijfveer.
Maar Spring's DI maakt gebruik van runtime-reflectie op taalniveau om DI te ondersteunen.
Dotnet doet hetzelfde, met behulp van attributen om via reflectie DI uit te voeren.
Hoe voert Nest.js dan DI uit?
Spring en Dotnet gebruiken gecompileerde talen, waardoor reflectie op taalniveau mogelijk is,
maar ecma script is gewoon een... geïnterpreteerde taal, nietwaar?
Hieronder staat een voorbeeld uit de Nest.js tutorial.
Deze in TypeScript geschreven code zal na compilatie de type-tags missen, en de constructor zal het argument type niet kennen.
De oplossing lag in de taalspecificatie.
Reflect
Gelukkig is er een functie die het toevoegen van metadata aan objecten mogelijk maakt.
Het is een eenvoudige functie om metadata toe te voegen aan en op te halen van objecten.
Dus TypeScript dacht:
Wat als we type-informatie in de metadata zouden zetten tijdens het compileren van de klasse?
Daarom slaat TypeScript de informatie over de benodigde argumenten voor de constructor op in Reflect, telkens wanneer een klassedecorator wordt gebruikt.
Hierbij is geen transformatie of zwarte magie gebruikt, het is puur een functie van de TypeScript-compiler.
Als de type-informatie van de constructorargumenten in de metadata van de klasse staat,
kunnen we die informatie gebruiken om de waarden in te vullen.
De implementatie hiervan is te vinden in NestJS, maar dat is te uitgebreid. Ik raad een andere library aan.
Deze library, gemaakt door Microsoft, heeft zeer nette code.
Ik raad aan om er eens naar te kijken, en hiermee sluit ik af.
Reacties0