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>;