Эффект NgRX 8 - createEffect () не работает - тип «Observable <unknown>» не может быть назначен типу «Observable <Action>» - PullRequest
1 голос
/ 22 октября 2019

У меня есть приложение ionic 4, где я использую NgRX 8.

Следующий код компилируется:

connect1$ =
    this.actions$.pipe(
        // restart counter on every click
        switchMap(() => interval(1000))
);

, но когда я использую createEffect () следующим образом:

   connect2$ = createEffect(() =>
        this.actions$.pipe(
            // restart counter on every click
            switchMap(() => interval(1000))
          )
    );

Я получаю следующую ошибку:

Тип «Наблюдаемый» нельзя назначить типу «Наблюдаемый |((... args: any []) => Observable) '

В предыдущем посте я видел предложение удалить createEffect (), чтобы решить проблему с синтаксисом. Но когда я делаю это, старый синтаксис не создает никаких проблем.

NgRX 8 эффектов - Тип 'Observable ' нельзя назначить типу 'Observable '

Какие-нибудь предложения относительно того, на что я мог бы смотреть?

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Более старый синтаксис, не имеет проверки типов - новый и, следовательно, эта ошибка. Теперь вы получаете ошибку во время компиляции вместо неожиданной ошибки во время выполнения.

Вы получаете эту ошибку, потому что эффект всегда должен возвращать Action, если не указано { dispatch: false }

0 голосов
/ 22 октября 2019

TL; DR : Вы ищете ActionsSubject?


Ваш эффект, похоже, ничего не дает (даже если у него было { dispatch: false }).

Я считаю полезным думать в терминах следующей диаграммы.

По моему мнению, эффекты должны быть либо

  1. чистым «действием в» → «действии»out 'effect
  2. побочный эффект, такой как навигация

Это заставляет вас думать следующим образом:

  • Если я создаю эффект, чторезультаты возможны (обычно успех / неудача)?

    Это приводит к созданию соответствующих действий для каждого.

  • Приведет ли это действие к изменению состояния?

Если вы хотитеизменить состояние, чем использовать соответствующие действия (скажем, RESTART_TIMER, который в состоянии редуктора обновляет состояние со времени последнего сброса) и использовать селектор для создания счетчика, но вам может быть лучше сделать это в компоненте с подпиской ActionsSubject, аналогичной этот вопрос

enter image description here

...