Electron-Redux,Typescript,Redux-Observable和Typed Actions

时间:2018-02-05 08:37:31

标签: typescript redux redux-observable

我来自ngrx背景,并且习惯于使用类型化动作的ngrx方式。

export class RestoreWindowState implements FluxStandardAction {
  public readonly type = windowActionTypes.WINDOW_RESTORE_STATE;

  constructor(public payload: IWindowState) {}
}

FluxStandardAction看起来像这样

export interface FluxStandardAction {
  type: string;
  payload?: any;
  error?: boolean;
  meta?: any;
}

我编写了一个自定义中间件来将new windowActions.RestoreWindowState(state)转换为普通对象。这是我的中间件的样子。

export const actionToPlainObjectMiddleware = store => next => action => {
  if (typeof action === 'object' && action.type) {
    const toForward = { ...action };
    return next(toForward);
  } else {
    throw new Error('Action must be FSA');
  }
};

现在,如果我这样做

const loadWindowStateFromStorageEpic = action$ =>
  action$.ofType(windowActionTypes.WINDOW_LOAD_STATE_FROM_STORAGE).pipe(
    mapTo(() => {
      const windowState = WindowStateKeeper.load('main');
      return new windowActions.RestoreWindowState(windowState);
    }),
  );

我得到了

Error: Action must be FSA

我哪里错了?

1 个答案:

答案 0 :(得分:1)

问题在于您使用的是mapTo而不是mapmapTo只接受一个参数,这是您要映射到的值。而map采用一个被调用的投影函数,用于将当前值映射到其他值 - 这就是你想要的。

// v--------- here
mapTo(() => {
  const windowState = WindowStateKeeper.load('main');
  return new windowActions.RestoreWindowState(windowState);
})

// change to
map(() => {
  const windowState = WindowStateKeeper.load('main');
  return new windowActions.RestoreWindowState(windowState);
})

因此,在这种情况下,您将操作映射到函数,并且该函数是按原样调度的。