我正在将我的应用程序从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'类型。 类型'可观察'不可分配给'动作'类型。 属性“类型”缺少“可观察”类型。
答案 0 :(得分:0)
看起来SetTokenAction
和LoginErrorAction
在结构上并不相同。他们必须具有相同的结构才能使其正常工作。更改效果以使其如下所示:
@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版本。
switchMap
和catchError
是可管道运算符,它们需要可观察的返回值。根据您的情况,第二个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))
);
})
);
}
``