【问题标题】:Get the type from a - "createAction" function从“createAction”函数获取类型
【发布时间】:2020-11-21 08:15:59
【问题描述】:

有两种创建 ngrx 动作的方法。一种是定义一个实现Action类的新类,另一种是使用“createAction”函数。有没有办法获取使用“createAction”方法创建的动作的类型?

例如,如果我有这个动作:

export const getWorker = createAction(
  '[Worker Api] Get Worker',
  props<{ workerId: number }>()
);

我想在监听该动作的效果中获取 workerId:

getWorker$ = createEffect(() => {
return this.actions$.pipe(
  ofType(WeatherApiActions.getWorker),
  switchMap((action: { type: string, workerId: number }) => this.workerService.getWorker(action.workerId)),
  map((worker: IWorker) => WeatherApiActions.getWorkerSuccess({ worker }))
)})

和你一样,我不得不自己写类型。这使得效果与动作紧密耦合,这是一个巨大的缺点。所以我的问题是:我是否必须使用第一种创建动作的方法才能获得动作有效负载类型?

【问题讨论】:

    标签: angular ngrx ngrx-effects


    【解决方案1】:

    我对 ng/ngrx 等比较陌生,但似乎使用 create* 辅助方法的部分原因是为了获得更好的类型支持。我也遇到了同样的问题,我的一个影响来自于此:

      authSignup = this.actions$.pipe(
        ofType(AuthActions.SIGNUP_START),
        switchMap((signupAction: AuthActions.SignupStart) => {
          return this.http.post<AuthResponseData>(
      ...
    

    到这里:

      authSignup = createEffect(() =>
        this.actions$.pipe(
          ofType(AuthActions.signupStart),
          switchMap(({ email, password }) => {
            return this.http
              .post<AuthResponseData>(
      ...
    

    动作如下:

    export const signupStart = createAction(
      "[Auth] Signup Start",
      props<{ email: string; password: string }>()
    );
    

    我花了一点时间才弄明白; switchMap 现在知道动作的道具是什么。而且,至少在最新的 VSCode 中,我在输入参数时得到了 IntelliSense 帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2023-01-20
      • 1970-01-01
      相关资源
      最近更新 更多