Angular 角度效应可观测类型误差

Angular 角度效应可观测类型误差,angular,ngrx,ngrx-effects,Angular,Ngrx,Ngrx Effects,我喜欢休闲的官方导游。我想为auth创建我的第一个存储对象。我想,如果我从logoutlogic开始,我可以更好地理解逻辑并提高技能 作为零步骤,我为http请求创建服务http auth.service.ts: 从'@angular/common/http'导入{HttpClient,HttpErrorResponse}; 从“@angular/core”导入{Injectable}; 从“rxjs”导入{throwError,observatable}; 从“rxjs/operators”导

我喜欢休闲的官方导游。我想为
auth
创建我的第一个存储对象。我想,如果我从
logout
logic开始,我可以更好地理解逻辑并提高技能

作为零步骤,我为http请求创建服务
http auth.service.ts

从'@angular/common/http'导入{HttpClient,HttpErrorResponse};
从“@angular/core”导入{Injectable};
从“rxjs”导入{throwError,observatable};
从“rxjs/operators”导入{catchError,map};
从“environments/environment”导入{environment};
从“app/shared/models”导入{RegistrationModel};
从“app/shared/models/common”导入{textsuccesmodel};
@可注射()
导出类HttpAuthService{
构造函数(私有http:HttpClient){}
$logout():可观察{
//@FIXME:post请求
返回此.http.get(`${environment.apirl}/auth/logout`).pipe(
映射((响应:textsuccesmodel)=>响应),
catchError(this.handleError())
);
}
私有句柄错误(){
返回(错误:HttpErrorResponse)=>{
return-throwerr(error.message | | |'出了问题');
};
}
}
我在单独的文件
actions/auth.actions.ts
中创建了
actions

从'@ngrx/store'导入{createAction};
//注销
export const logout=createAction(“[Auth]注销请求”);
export const logoutSuccess=createAction(“[Auth]注销成功”);
export const logoutError=createAction(“[Auth]注销失败”);
接下来,我在
reducers/auth.reducer.ts
中创建了
reducer

从'@ngrx/store'导入{Action,createReducer,on};
从“../actions/auth.actions”导入*作为AuthActions;
导出接口身份验证状态{
id:string | null;
记住:布尔;
}
导出常量initialState:AuthState={
id:null,
记住:错,
};
导出常量authReducer=createReducer(
初始状态,
//注销
打开(authoctions.logout,(状态)=>({
状态
加载:对,
})),
在(AuthActions.logoutSuccess,()=>initialState)上,
打开(AuthActions.logout,()=>initialState)
);
导出函数缩减器(状态:AuthState |未定义,操作:操作){
返回(状态、动作);
}
接下来,我为store创建模块

从'@angular/common'导入{CommonModule};
从'@angular/common/http'导入{HttpClientModule};
从“@angular/core”导入{NgModule};
从'@ngrx/effects'导入{EffectsModule};
从'@ngrx/store'导入{StoreModule};
从'@angular/router'导入{RouterModule};
从“/effects”导入{effects};
从“./reducers”导入{reducers};
@NGD模块({
进口:[
公共模块,
HttpClientModule,
StoreModule.forFeature('entityCache',减速器),
EffectsModule.forFeature(效果),
路由模块,
],
导出:[StoreModule,EffectsModule],
})
导出类AppStoreModule{}
最后,我尝试创建一个效果
auth.effects.ts

从'@angular/core'导入{Injectable};
从'@angular/Router'导入{Router};
从'rxjs'导入{可观察的};
从“rxjs/operators”导入{exhaustMap,tap,catchError};
从'@ngrx/effects'导入{Actions,createEffect,of type};
从'app/services/http'导入{HttpAuthService};
从“app/shared/models/common”导入{textsuccesmodel};
从“../actions/auth.actions”导入*作为AuthActions;
@可注射()
导出类AuthEffects{
建造师(
私有操作$:操作,
专用路由器:路由器,
私有httpAuthService:httpAuthService
) {}
/**
*注销
*/
注销$=createEffect(()=>{
返回此.actions$.pipe(
类型(authoctions.logout),
排气图(()=>{
返回此.httpAuthService.$logout().pipe(
轻触(()=>AuthActions.logoutSuccess()),
catchError(()=>of(AuthActions.logoutError())
);
})
);
});
}
vscode标记了我的类似代码的错误:

function(): Observable<TextSuccessModel | TypedAction<"[Auth] Logout Fail">>
Argument of type '() => Observable<TextSuccessModel | TypedAction<"[Auth] Logout Fail">>' is not assignable to parameter of type '() => Observable<Action> | ((...args: any[]) => Observable<Action>)'.
  Type 'Observable<TextSuccessModel | TypedAction<"[Auth] Logout Fail">>' is not assignable to type 'Observable<Action> | ((...args: any[]) => Observable<Action>)'.
    Type 'Observable<TextSuccessModel | TypedAction<"[Auth] Logout Fail">>' is not assignable to type 'Observable<Action>'.
function():可观察
“()=>Observable”类型的参数不能分配给“()=>Observable |”((…args:any[])=>Observable)”类型的参数。
类型“Observable”不可分配给类型“Observable”((…args:any[])=>Observable)”。
类型“Observable”不可分配给类型“Observable”。

我是新来的。我为旧的angular版本找到了创建对象类型的解决方案。但我不知道如何解决这个问题。请提供帮助。

效果应始终返回操作(除非标记为dispatch false)

tap运算符不返回值,因为它是空的。 您应该使用映射返回成功操作

  logout$ = createEffect(() => {
    return this.actions$.pipe(
      ofType(AuthActions.logout),
      exhaustMap(() => {
        return this.httpAuthService.$logout().pipe(
          map(() => AuthActions.logoutSuccess()),
          catchError(() => of(AuthActions.logoutError()))
        );
      })
    );
  });

非常感谢。那么我什么时候应该使用
tap
operator呢?如果你不想返回任何东西,rxjs的文档会很好地解释这一点