Ngrx: свойство "[Symbol.observable]" отсутствует в типе "Store<boolean>" ошибка

Я использую NGRX v4.1.1 в приложении Angular v5 (с "strictNullChecks": trueхотя это не имеет значения).

Я вижу ошибку с магазином. Учитывая следующее:

showLists: Observable<boolean>;

constructor(private store: Store<State>) {}

ngOnInit() {
  this.showLists = this.store.select('contactsFeature', 'contactsReducer', 'showListsPanel');
}

Typescript вызывает ошибку на this.store.select():

Type 'Store<boolean>' cannot be converted to type 'Observable<boolean>'.
Property '[Symbol.observable]' is missing in type 'Store<boolean>'.

Этот метод выбора ломтика магазина (с помощью .select) и присваивая его переменной типа Observable<> официально описан в документации (на самом деле я вижу, что они обновили документацию до рекомендуемого API ngrx v5, но v5 еще не выпущена, поэтому я связался со следующей последней версией документации).

Проблема в том, что store.select() имеет тип возврата Store<> который несовместим с Observable<>,

Однако это "официальный" метод взаимодействия с магазином (я думаю). Поэтому мне интересно, что происходит не так. Если я отключу strictNullChecksЯ все еще сталкиваюсь с ошибкой. Ошибка появилась в проекте, к которому я возвращаюсь через месяц, и я не могу определить, когда именно он начался (или почему, очевидно).

Любые предложения приветствуются:)

PS: машинопись не даст мне разыграть возвращение .select() к наблюдаемому.

Обновить

Обновление npm предоставило мне лучшее сообщение об ошибке. Похоже, что либо интерфейс rxjs был обновлен, либо, возможно, имеет ngrx.

ERROR in apps/coordination/src/app/contacts/contacts-tools.component.ts(21,5): error TS2322: Type 'Store<boolean>' is not assignable to type 'Observable<boolean>'.
  Types of property 'subscribe' are incompatible.
    Type '{ (observer?: NextObserver<boolean> | ErrorObserver<boolean> | CompletionObserver<boolean> | unde...' is not assignable to type '{ (observer: Observer<boolean>): Subscription; (onNext: (value: boolean) => void, onError?: ((err...'.
      Types of parameters 'observer' and 'observer' are incompatible.
        Type 'Observer<boolean>' is not assignable to type 'NextObserver<boolean> | ErrorObserver<boolean> | CompletionObserver<boolean> | undefined'.
          Type 'Observer<boolean>' is not assignable to type 'CompletionObserver<boolean>'.
            Types of property 'complete' are incompatible.
              Type '(() => void) | undefined' is not assignable to type '() => void'.
                Type 'undefined' is not assignable to type '() => void'.

2 ответа

Решение

Я использую vscode с автоматическим импортом модулей. т.е. если я использую класс из модуля npm, vscode автоматически добавит import Заявление в начало файла.

Видимо, один из моих модулей npm (не rxjs) определил свой собственный Observable, и vscode автоматически импортировал это, не наблюдаемый rxjs. Эта наблюдаемая не-rxjs вызывала проблему с типом.

Я не уверен, как выглядят ваши редукторы, но я предполагаю, что:

contactsFeature -> редуктор contactsReducer -> является атрибутом в contactsFeature showListsPanel -> является атрибутом в объекте contactsReducer

Вы можете использовать.select('reducer', 'atribute', 'sub'...) вместо выщипывания ( .pluck).

для другого вопроса, вы можете выбрать с помощью:

this.showLists = this.store.select('contactsFeature', 'contactsReducer', 'showListsPanel') as Observable<boolean>;
Другие вопросы по тегам