我正在尝试键入一个高阶减速器,并设法缩小问题的范围,问题来自于Reducer
的state
类型定义中的{{1} }},如果我删除redux
并仅以S | undefined
的形式输入undefined
,则一切正常
state
问题在于,高阶减速器不会使用S
所要求的默认值来初始化状态,因为它调度了一个在任何减速器中都不匹配的操作,从而用初始值来填充商店值,但我想打字稿不能告诉内部reducer会处理。
除了从类型定义中删除未定义之外,我在这里还有哪些选择?
底部export type Reducer<S = any, A extends Action = AnyAction> = (
state: S | undefined,
action: A
) => S
中的电影类型为redux
高阶减速器
src > reducers.ts > RootState
内减速器
never
我遇到的错误
(属性)电影:Reducer 没有重载匹配此调用。 重载1,共2个,'((reducers:ReducersMapObject <{电影:LoadingStates;趋势:Record;},any>):Reducer <...>',出现以下错误。 类型“(状态:LoadingStates,动作:MovieByIdActionTypes)=> LoadingStates”不可分配给类型“ Reducer”。 参数“状态”和“状态”的类型不兼容。 输入'LoadingStates |未定义”无法分配给“ LoadingStates”类型。 无法将“未定义”类型分配给“ LoadingStates”类型。ts(2769)
答案 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
进行初始化,并且还要求baseReducer
用undefined
值调用时返回State。
这是修改后的沙箱:https://codesandbox.io/s/bold-visvesvaraya-15f5o