- 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.
Sviluppando server con Node.js, ci si trova spesso di fronte alla tentazione di utilizzare Spring.
Questo perché è strutturato, sistematico ed è difficile "evasione" arbitraria.
Quindi, nell'ambito di Node.js, è nato il framework Nest.js.
Si trattava di un forte desiderio di poter sviluppare server almeno in una forma strutturata come Spring.
Tuttavia, l'Iniezione di Dipendenze (DI) di Spring utilizza la riflessione in runtime per supportare l'esecuzione della DI a livello di linguaggio.
Anche Dotnet fa lo stesso, tracciando in base agli attributi ed eseguendo la DI tramite riflessione.
Allora, come Nest.js riesce a eseguire la DI?
Spring e Dotnet si basano su linguaggi compilati, quindi supportano la riflessione a livello di linguaggio, ma...
ecma script è solo... un linguaggio interpretato, semplice e comune, no?
Di seguito è riportato un esempio tratto da un tutorial di Nest.js.
Certo, questo codice scritto in TypeScript, una volta compilato, sarà privo di tag di tipo, e non conoscerà il tipo di argomento necessario per il costruttore della classe, giusto?
La soluzione si trova nelle specifiche del linguaggio.
Reflect
Fortunatamente, esiste una funzionalità creata appositamente per aggiungere metadati a ciascun oggetto a livello di linguaggio.
È semplicemente una funzione semplice per aggiungere e recuperare metadati da un oggetto.
Quindi TypeScript ha pensato:
E se durante la compilazione della classe, aggiungessimo le informazioni sul tipo ai metadati?
Quindi TypeScript, in ogni punto in cui viene utilizzato un decoratore di classe, salva le informazioni sul tipo di argomento necessario per il costruttore della classe in Reflect.
Non c'è nessuna trasformazione o magia nera, è solo una funzionalità del compilatore TypeScript.
In questo modo, se le informazioni sul tipo degli argomenti necessari per il costruttore sono contenute nei metadati della classe...
possiamo semplicemente richiamare la classe e conoscere il tipo, quindi possiamo inserirlo direttamente.
Per l'implementazione, è possibile consultare NestJS, ma questo è troppo lungo, quindi vi consiglio un'altra libreria.
Essendo creata da Microsoft, questa libreria ha un codice molto pulito.
Vi consiglio di dare un'occhiata, e con questo concludo l'articolo.
Commenti0