У меня есть библиотека Angular, которая используется рядом других проектов.В настоящее время я обновляю его до Angular 6.
В библиотеке есть несколько мест, где мне нужно получить класс для инъекций, но я не могу использовать обычный конструктор DI, например, в пользовательском декораторе.Для этого у меня есть собственный распознаватель, который использует метод Injector.get
, чтобы получить ссылку на инъецируемый класс.Средство распознавания выглядит следующим образом:
import { Injectable, Injector } from '@angular/core';
@Injectable()
export class CoreModuleInjector {
public static injector: Injector;
constructor(public injector: Injector) {
CoreModuleInjector.injector = injector;
}
public static get(token: any): any {
if (CoreModuleInjector.injector) {
return CoreModuleInjector.injector.get(token);
}
return null;
}
}
А затем в других местах я использую его так:
const state: any = CoreModuleInjector.get(ActivatedRoute);
Это работает в приложениях, которые используют библиотеку, но я вижупредупреждение lint для пользовательского распознавателя, которое гласит:
get устарела: начиная с v4.0.0 используйте Type или InjectionToken
И я не могу выполнить сборку prod, когдаЯ пытаюсь, я вижу эту ошибку:
Собранные метаданные содержат ошибку, о которой будет сообщено во время выполнения: на ссылки могут ссылаться только на инициализированные переменные и константы, поскольку компилятору шаблона требуется значение этой переменной.
Ошибка указывает на строку return CoreModuleInjector.injector.get(token);
в пользовательском распознавателе.Я попытался изменить эту строку следующим образом:
return CoreModuleInjector.injector.get<any>(token as any);
И это устраняет ошибку lint, но не исправляет ошибку сборки.
Я бы хотел исправитьпроблема сборки, чтобы я мог продолжать использовать инжектор таким же образом, или, в качестве альтернативы, мне нужен лучший способ получить инъекционные классы в местах, где обычный DI не может быть использован