В отличие от строго типизированных языков, типы TypeScript не существуют во время выполнения.Можно использовать информацию о типе во время выполнения для внедрения зависимости, но ограниченным образом.С помощью опции emitDecoratorMetadata
TypeScript можно получить типы параметров конструктора и использовать их для DI.
Пример: injection-js
, то есть угловой инжектор, извлеченный избиблиотека для автономного использования.Для класса с поддержкой DI необходимо использовать только декоратор @Injectable
, декораторы параметров @Inject
являются необязательными.
Ограничения заключаются в том, что таким образом могут вводиться только экземпляры класса:
constructor(foo: FooClass) {}
Обобщения игнорируются и отбрасываются:
constructor(foo: FooClass<Bar>) {}
Другие типы игнорируются и приводят к ошибке DI:
constructor(foo: fooSymbol) {}
constructor(foo: 'foo string provider') {}
То же применяется к InversifyJS :
В случае конкретных инъекций вы можете просто определить параметры конструктора как обычно, не используя @inject decorator.
InversifyJS также поддерживает назначения конструкторов TypeScript, поэтому вы можете иметь частные или защищенные модификаторы доступав ваших параметрах и контейнере не составит труда ввести зависимости
Можно было бы опустить @inject
для Weapon
и ThrowableWeapon
, если бы они были классами, но в перечисленном примере TYPES.Weapon
является символом, а Weapon
является интерфейсом, который не существует во время выполнения , поэтому @inject
необходим.