Как сделать действия известными при использовании ngrx-эффектов оператора типа - PullRequest
0 голосов
/ 02 февраля 2020

Моя кодовая база интенсивно использует ngrx-эффекты, и мы используем ofType, например:

  @Effect()
  someEffect$ = this.actions$
    .ofType<LoginAction>(UserActions.LOGIN)
  . . .

Я вспоминаю, что читал некоторое время назад - но не могу найти ссылку - что эффекты ngrx больше не действуют нужен как экземпляр типа generi c, так и аргумент action. Проверяя документы, я нахожу этот пример в v7 Руководстве по обновлению :

  @Effect()
  someEffect$ = this.actions$
    .ofType(UserActions.LOGIN)
  . . .

То есть используется вариант non -generi c ofType.

Теперь на самой странице документов ofType мне кажется, что я подтверждаю, что оба они не нужны, указав:

Для обратной совместимости когда передается один аргумент типа ofType<T>('something'), результатом является Observable<T>. Обратите внимание, что T полностью отвергает любой возможный вывод из «чего-то». К сожалению, для неизвестных 'actions: Actions' эти типы будут производить 'Observable'. В таких случаях необходимо вручную установить тип generi c как actions.ofType ('add').

Теперь вот мой фактический код:

    @Effect()
    toggleTokenFailure$ = this.actions$.pipe(  
      ofType<ToggleTokenActiveFailure>(ApiTokenActionTypes.TOGGLE_FAILURE),
      map(({ payload: { error } }) => new CreateNotification({
      . . .

Если я изменю строку ofType на эту:

    ofType(ApiTokenActionTypes.TOGGLE_FAILURE),

, код все еще работает, но я теряю набор текста на payload (становится any). В исходной строке тип payload был HttpErrorResponse (потому что это тип ToggleTokenActiveFailure.payload).

Итак, согласно документам, которые я цитировал выше, почему мое действие «неизвестно», или, более того, как мне сделать это известным?

1 Ответ

0 голосов
/ 02 февраля 2020

Чтобы сделать эти типы известными, вы должны либо предоставить использование ofType<YourAction>(...), как вы делали раньше, либо предоставить Actions в своем конструкторе. В этом случае это может выглядеть так:

type SomeActionsType = ToggleTokenActiveFailure | OtherAction;

@Injectable()
export class SomeEffects {
  constructor(private actions$: Actions<SomeActionsType>) {}

  . . .

  @Effect()
  toggleTokenFailure$ = this.actions$.pipe(  
    ofType(ApiTokenActionTypes.TOGGLE_FAILURE),
    map(({ payload: { error } }) => new CreateNotification({
    . . .
}
...