Этот конструктор не совместим с Angular Dependency Injection, кроме случаев, когда все в порядке - PullRequest
0 голосов
/ 19 апреля 2020

Я получаю эту ошибку только при тестировании. Мой build -prod работает, проект демонстрационного приложения, который использует встроенную библиотеку, может полностью взаимодействовать со всеми аспектами параметров рассматриваемых сервисов. Я использую сборник рассказов и вижу загруженные фиктивные данные, которые не вызывают проблем при работе непосредственно в библиотеке с ivy. Я на angular 9.1.1. Тесты в шутку, но это не проблема в других местах проекта.

У меня есть библиотека, которая имеет 2 службы, полученные из базового класса. Сам базовый класс не имеет @Injectable decorator.

Тест для одной из дочерних служб выдает ошибку:

    This constructor is not compatible with Angular Dependency Injection because its dependency at index 0 of the parameter list is invalid.
    This can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator.

    Please check that 1) the type for the parameter at index 0 is correct and 2) the correct Angular decorators are defined for this class and its ancestors.

Как ни странно, другой службы нет. Добавление декоратора @Injectable требует, чтобы я также изменил базовый класс, чтобы параметр 0 всех трех классов был одинаковым для каждого символа. Но после этого я продолжаю получать сообщение об ошибке.

некоторые фрагменты:

  • базовый класс
/** this base class exists because we provide a standard mock for the alerts service */
@Injectable()
export abstract class AlertsBase
  implements IPreloadingService, ICommonService {
  abstract serviceIdentifier: IConstructor<AlertsBase>
  isPreloaded: boolean
  delegate: ICachingService

  constructor (
    @Inject(CACHING_SERVICE_DELEGATE) cachingService: ICachingService
  ) {
    this.delegate = cachingService
  }
  • проходящий класс
/** exposed mock service (a demonstration) */
@Injectable({
  providedIn: 'root'
})
export class MockAlertsService extends AlertsBase {
  serviceIdentifier = AlertsService

  constructor (
    @Inject(CACHING_SERVICE_DELEGATE) cachingService: ICachingService,
    @Inject(ALERTS_ENDPOINT) private endpoint: string,
    @Inject(MOCK_APP_ALERTS) private model: string
  ) {
    super(cachingService)

    console.debug('%c[MockAlertsService]', 'color: #f6b73c', 'constructor')
  }
  • класс ошибки
/** get alerts to display atop each page in alert components */
@Injectable({
  providedIn: 'root'
})
export class AlertsService extends AlertsBase {
  serviceIdentifier = AlertsService

  constructor (
    private httpClient: HttpClient,
    @Inject(CACHING_SERVICE_DELEGATE) cachingService: ICachingService,
    @Inject(ALERTS_ENDPOINT) private endpoint: string
  ) {
    super(cachingService)

    console.debug('%c[AlertsService]', 'color: #f6b73c', 'constructor')
  }

1 Ответ

1 голос
/ 19 апреля 2020

Переместите параметр HttpClient в конструкторе AlertsService, чтобы он стал последним параметром.

Порядок параметров конструктора важен в ситуации, когда класс расширяет другой класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...