NGRX效果属性“类型”在类型Observable <any []中丢失

时间:2019-07-14 18:29:14

标签: angular typescript rxjs ngrx

我正在将我的应用程序从v6升级到v7。 我还将Typescript版本从2.7.2升级到3.1.6

我的问题是当我打字稿投诉我的ngrx效果缺少属性“ type”时。在2.7.2中不会发生

也许我不了解这些类型是如何工作的。您能告诉我我在做什么错吗?

    @Effect()
    login(): Observable<Action> {
        return this.actions$.pipe(
            ofType(AuthActionTypes.LOGIN),
            switchMap((action: LoginAction) => {
                const username = action.username;
                const password = action.password;
                return this.authenticationService.login(username, password)
                    .pipe(
                        switchMap(token => {
                            return [
                                new SetTokenAction({token: token}),
                            ];
                        }),
                        catchError(err => {
                            return [new LoginErrorAction((err))];
                        })
                    );
            })
        );
    }

这是代码的结果

  

TS2322:   类型'Observable>'不可分配给'Observable'类型。   类型'可观察'不可分配给'动作'类型。   属性“类型”缺少“可观察”类型。

2 个答案:

答案 0 :(得分:0)

看起来SetTokenActionLoginErrorAction在结构上并不相同。他们必须具有相同的结构才能使其正常工作。更改效果以使其如下所示:

@Effect()
    login(): Observable<Action> {
        return this.actions$.pipe(
            ofType(AuthActionTypes.LOGIN),
            switchMap((action: LoginAction) => {
                const username = action.username;
                const password = action.password;
                const actions = new Array<Action>();
                return this.authenticationService.login(username, password)
                    .pipe(
                        switchMap(token => {
                            actions.push(new SetTokenAction({token: token}));
                            return actions;
                        }),
                        catchError(err => {
                            actions.push(LoginErrorAction(err));
                            return actions;
                        })
                    );
            })
        );
    }

答案 1 :(得分:0)

似乎您也已经升级了RxJs版本。

switchMapcatchError是可管道运算符,它们需要可观察的返回值。根据您的情况,第二个switchCase中没有必要,可以将其替换为map

@Effect()
    login(): Observable<Action> {
        return this.actions$.pipe(
            ofType(AuthActionTypes.LOGIN),
            switchMap((action: LoginAction) => {
                const username = action.username;
                const password = action.password;
                return this.authenticationService.login(username, password)
                    .pipe(
                        map(token => new SetTokenAction({token: token}),
                        catchError(err => of(LoginErrorAction(err))
                    );
            })
        );
    }
``