键入高阶减速器;参数“状态”和“状态”的类型不兼容

时间:2020-01-10 21:31:05

标签: typescript redux

我正在尝试键入一个高阶减速器,并设法缩小问题的范围,问题来自于Reducerstate类型定义中的{{1} }},如果我删除redux并仅以S | undefined的形式输入undefined,则一切正常

state

问题在于,高阶减速器不会使用S所要求的默认值来初始化状态,因为它调度了一个在任何减速器中都不匹配的操作,从而用初始值来填充商店值,但我想打字稿不能告诉内部reducer会处理。

除了从类型定义中删除未定义之外,我在这里还有哪些选择?

底部export type Reducer<S = any, A extends Action = AnyAction> = ( state: S | undefined, action: A ) => S 中的电影类型为redux

Sandbox

高阶减速器

src > reducers.ts > RootState

内减速器

never

我遇到的错误

(属性)电影:Reducer 没有重载匹配此调用。 重载1,共2个,'((reducers:ReducersMapObject <{电影:LoadingStates;趋势:Record;},any>):Reducer <...>',出现以下错误。 类型“(状态:LoadingStates,动作:MovieByIdActionTypes)=> LoadingStates”不可分配给类型“ Reducer”。 参数“状态”和“状态”的类型不兼容。 输入'LoadingStates |未定义”无法分配给“ LoadingStates”类型。 无法将“未定义”类型分配给“ LoadingStates”类型。ts(2769)

1 个答案:

答案 0 :(得分:2)

您可以按以下方式修改withLoadingState高阶减速器:

const withLoadingStates = ({ start, success, error }: LoadingActionTypes) => {
  const actionReducerMapper = {
    [start]: startReducer,
    [success]: successReducer,
    [error]: errorReducer
  };

  return <S, A extends Action>(
    baseReducer: (state: S | undefined, action: A) => S
  ) => (state: S | undefined, action: A): S => {
    const nextState = actionReducerMapper[action.type]
      ? actionReducerMapper[action.type](state)
      : state;

    return baseReducer(nextState, action);
  };
};

然后,这些类型强制执行以下操作:返回包装的减速器,该减速器接受undefined进行初始化,并且还要求baseReducerundefined值调用时返回State。 这是修改后的沙箱:https://codesandbox.io/s/bold-visvesvaraya-15f5o