@historydev
Острая аллергия на анимешников

Как реализовать DI как в ангуляре?

Интересует @Injectable()
@Injectable() class A { }
class B { constructor(private a: A) {} }

Следом тебе не нужно передавать new A(), за тебя это делает angular, но как и где?

В модуль мы передаём этот сервис, что происходит дальше?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 3
EreminD
@EreminD
Кое-что умею
а вам надо DI реализовать самому или вы его в проекте своем хотите..?

https://blog.logrocket.com/top-five-typescript-dep...
Ответ написан
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
Интересует @Injectable()

Эта штука называется "декоратор".
Декоратор - это по сути просто функция, которая принимает на вход другую функцию или класс или метод класса или свойство класса и может его подменить или модифицировать.
То есть Injectable - это просто функция, которая возвращает другую функцию, в которую передается ссылка на класс A, и она может сделать с ним что угодно. Например в данном случае она просто запоминает этот класс в DI контейнере.
Надо учитывать, что декораторы являются экспериментальной фичей TypeScript, их нужно включить в tsconfig, а так же никто не гарантирует, что декораторы всегда будут работать так как работают сейчас, тем более декораторы из TypeScript конфликтуют с декораторами из пропозала в ECMAScript (стандарт JS).
Подробнее про декораторы можно почитать тут: https://www.typescriptlang.org/docs/handbook/decor...

Ну а про устройство Dependency Injection лучше нагуглить какую-либо статью и почитать, ибо в рамках ответа не распишешь всех тонкостей.
Но если вкратце, нам нужен некоторый контейнер, в котором мы отобразим все injectable сущности и их зависимости, а в последствии сможем их оттуда извлекать по запросу, в идеале по типу данных (хотя в TS с этим туго, ибо типы живут только в compiletime), но можно и по классу (которые в TS представлены и типом и runtime значением).
Ответ написан
Aetae
@Aetae Куратор тега TypeScript
Тлен
Во первых DI в js\ts - полная бессмысленная хуита. Просто импортируй по-человечески что надо и используй.

Но если очень хочется - это сложно. Механизм DI не предусмотрен в парадигме языка. Тебе придётся использовать свою особую надстройку над системой сборки, которая найдёт в файлах подобные DI и заменит их на обычные человеческие импорты. Сделать можно это тремя основными способами: как трансформермер для typescript, как трансформермер для babel и как кастомный loader для webpack. Во всех случаях это включает в себя работу с AST и кодогенерацию на этапе сборки.

Впрочем, в залежах npm наверняка можно нарыть что-то готовое, чтоб не писать самому.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы