Доступ к реквизитам действий в эффекте @ngrx с ofType для нескольких действий - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть 2 Действия и Эффект для этих 2 действий с использованием оператора ofType, как показано ниже:

export const myActions = {
  actionA: createAction(`actionA`, props<{ a: string }>()),
  actionB: createAction(`actionB`, props<{ b: number }>())
}

myEffect$ = createEffect(() =>
  this.actions$.pipe(
    ofType(myActions.actionA, myActions.actionB),
    mergeMap(action => {
      // How to convert action object to correct type and access action.a or action.b props?
      if (action.type == myActions.actionA) {
        console.log(action.a); // compile error
      } else if (action.type == myActions.actionB) {
        console.log(action.b); // compile error
      }
    })
  ), {dispatch: false}
);

Как я могу проверить и получить доступ к реквизитам действий (action.a и action.b) и с автозаполнением из IDE?

1 Ответ

1 голос
/ 25 февраля 2020

ofType принимает в качестве обобщенного c params тип действия, например, ofType<Action>(actionType), тогда аргумент карты слияния будет набираться как Action без ввода.

В вашем случае action аргумент может быть ActionA или ActionB, так что вы должны написать ofType<ActionA | ActionB>(actionTypeA, actionTypeB), тогда action из mergeMap будет напечатано как Union of ActionA и ActionB. Но в правильных ветвях if, таких как (action.type == myActions.actionA), действие будет напечатано только ActionA, потому что TS complier понимает некоторые операторы ifs.

Кстати, совет @timdeschryver разделить его на 2 эффекта очень хорош.

============== отредактировано =================

Если вы определяете действие с помощью export const actionA = createAction('actionA', props<{ a: string }>()) Вы можете объявить тип ActionA с помощью type ActionA = ReturnType<typeof actionA>;. ReturnType является обобщенным c добавлено в TypeScript.

...