Несоответствие типов при действии на эффект ngrx - PullRequest
1 голос
/ 18 июня 2019

Я создал файл действий с этими 3 действиями:

export const showLoading = createAction(`[application] Show warning notification`);
export const hideLoading = createAction(`[application] Show error notification`);
export const showHttpResponseError = createAction(`[application] Show success notification`, props<{ error: HttpErrorResponse, nextAction: Action }>());

export type Actions = ReturnType<
typeof showLoading |
typeof hideLoading |
typeof showHttpResponseError
>;

Затем я создал файл эффектов следующим образом:

@Injectable()
export class ApplicationEffects
{
    constructor(private actions$: Actions, private dialogsService: DialogsService, public notificationsService: NotificationService, private router: Router) { }

    @Effect() public erroHandler$ = this.actions$
        .pipe(
            ofType(ApplicationActions.showHttpResponseError.type),
            switchMap(action => {
                    const emptyAction = { type: 'noop' };
                    const error = HttpErrorHandler.handle(action.error);

                    if (error.redirectTo != null) {
                        this.router.navigate([error.redirectTo]);
                        return of(emptyAction);
                    }

                    if (action.error.status === 400) {
                        this.notificationsService.notifyWarning('AVISO', error.messages);
                    }
                    else {
                        this.dialogsService.errorDialog('ERRO', error.messages[0]);
                    }

                    return action.nextAction ? of(action.nextAction) : of(emptyAction);
                },
            ));
}

Но по какой-то причине intellisense кода VS не распознает тип действия в switchMap, он говорит, что он имеет тип never:

enter image description here

Я что-то упустил? Или как я могу применить его тип, поскольку действие создается с использованием создателей действий ngrx, у меня нет для него типа explicity.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Для полноты, есть несколько способов:

1) тип оператора ofType

ofType<AddAction>(CounterActions.AddAction)

2) введите введенные действия, как вы уже ответили (начиная с NgRx7)

constructor(private actions$: Actions<CounterActions.Actions>

3) использовать createEffect в сочетании с createAction (начиная с NgRx 8)

foo$ = createEffect(() => this.actions$.pipe(
    ofType(addAction),
    ...
);
0 голосов
/ 18 июня 2019

Для дальнейшего использования, если у кого-то возникнет та же проблема, необходимо ввести введенную переменную actions$:

private actions$: Actions<ApplicationActions.Actions>

Тогда intellisense работает, и вам не нужно применять тип в switchMap

...