Библиотека Angular 6 исправляет ошибки сборки и использует Injector.get - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть библиотека 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 не может быть использован

...