- 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 часто возникает соблазн использовать множество функций Spring.
Это связано с тем, что Spring — структурированная, систематизированная платформа, из которой сложно произвольно выйти.
Поэтому в сообществе Node.js появился фреймворк Nest.js.
Многие разработчики стремились к созданию серверов в структурированной форме, подобной Spring.
Однако DI в Spring использует отражение во время выполнения, обеспечивая поддержку DI на уровне языка.
То же самое относится и к Dotnet, где DI осуществляется с помощью отражения на основе атрибутов.
Как же тогда Nest.js осуществляет DI?
Spring и Dotnet основаны на компилируемых языках, которые поддерживают отражение на уровне языка, в то время как...
ecma script — всего лишь интерпретируемый язык.
Ниже приведен один из примеров из руководства Nest.js.
Очевидно, что после компиляции код TypeScript, написанный таким образом, будет без тегов типов, и поэтому не будет известен тип аргумента, необходимого для конструктора класса.
Решение нашлось в спецификации языка.
Reflect
К счастью, на уровне языка существует функция, позволяющая добавлять метаданные в каждый объект.
Это простая функция добавления и получения метаданных для объектов.
Поэтому TypeScript подумал:
А что если при компиляции класса добавлять информацию о типах в метаданные?
Таким образом, TypeScript хранит информацию о типах аргументов, необходимых для конструктора, в Reflect для каждого класса, к которому применяется декоратор класса.
Здесь не используется никакая трансформация или "черная магия", это исключительно функция компилятора TypeScript.
Если типы аргументов конструктора класса хранятся в метаданных этого класса,
мы можем получить эти типы при вызове класса и использовать их.
Реализацию можно посмотреть в NestJS, но это слишком сложно, поэтому я порекомендую другую библиотеку.
Библиотека разработана Microsoft, поэтому код довольно чистый.
Рекомендую ознакомиться с ней, на этом я закончу статью.
Комментарии0