reactjs - React redux typescript 为 reducer action 分配两个接口
问题描述
在 react typescript 中,如何将两个接口分配给 reducer 函数:标准 {type: string, payload: object} 和 redux-thunk?
减速器.ts
interface IReduxThunkAction {
(dispatch: any): Promise<void>;
}
interface IActionPayload {
type?: string;
payload?: any;
}
type IAction = IActionPayload | IReduxThunkAction;
const reducer = (prevState = initialState, action: IAction): IInitialState => {
switch (action.type) {
case UPDATE_ITEMS:
return updateItemsData(prevState, action.payload);
default:
return prevState;
}
};
这是给我的错误:
类型“IAction”上不存在属性“类型”。类型“IReduxThunkAction”上不存在属性“类型”。
动作.ts
export const getItems = (
term: string
): ThunkAction<Promise<void>, {}, {}, AnyAction> => {
return (dispatch: ThunkDispatch<{}, {}, AnyAction>): Promise<void> => {
return searchItems(term)
.then(response => {
const { results } = response.data;
dispatch(updateItems(results));
})
.catch(() => {
dispatch(fetchError());
});
};
};
项目列表.tsx
// function with useReducer hook inside it
const [reducerState, dispatch] = useReducer(reducer, initialState);
// more code...
const handleSearch = (event: { preventDefault: () => void }) => {
event.preventDefault();
if (validateInput(state.value)) {
dispatch(actions.changeSpinnerState());
return dispatch(actions.getItems(state.value))
.then(() =>
dispatch(actions.changeSpinnerState())
);
}
};
在这里它告诉我在线调度(actions.getItems(state.value)):
'ThunkAction, {}, {}, AnyAction>' 类型的参数不能分配给'IAction' 类型的参数。类型“ThunkAction、{}、{}、AnyAction>”不可分配给类型“IReduxThunkAction”。
解决方案
好的,我解决了:
项目列表.tsx
const [reducerState, dispatch] = useReducer(reducer, initialState);
// more code...
const handleSearch = (event: { preventDefault: () => void }) => {
event.preventDefault();
if (validateInput(state.value)) {
dispatch(actions.changeSpinnerState());
dispatch(actions.changeSpinnerState());
actions.getItems(state.value)(dispatch as IActionPayload);
}
};
动作.ts:
export const getItems = (term: string): React.Dispatch<IActionPayload> => {
return (dispatch: any): Promise<void> => {
return searchItems(term)
.then(response => {
const { results } = response.data;
dispatch(actions.changeSpinnerState());
dispatch(updateItems(results));
})
.catch(() => {
dispatch(fetchError());
});
};
};
减速器.ts:
const reducer = (prevState = initialState, action: IActionPayload
): IInitialState => {
switch (action.type) {
case UPDATE_ITEMS:
return updateItemsData(prevState, action.payload);
default:
return prevState;
}
};
推荐阅读
- ruby-on-rails - # 未定义的方法 `with_indifferent_access'
我有一个包含三个模型的嵌套表单
vehicle
,vehicle_key_feature
并且与vehicle_detail
wherevehicle_key_feature
和vehi
- php - 大数据php的循环问题
- javascript - 如何将从数据库动态填充的下拉列表添加到数据表gridview中的每一行
- c# - 通过 VSTO 加载项打开现有 MS Word 文档时出现异常,您无法关闭 Microsoft Word,因为打开了一个对话框
- javascript - 从 request.files _ nodejs 读取内容
- javascript - 如何在reactjs中重复获取并渲染更新的api数据?
- python-3.x - 如何在python的3d图中设置轴的线宽?
- c++ - 将 std::variant 与 gmock 1.8 对象一起使用时编译错误
- python - Python:网页抓取标签导航 wiki 表
- javascript - 测试变量类型或抛出 TypeScript 的函数?