当从 JS 重写为 TS 时,Redux mapDispatchToProps 抛出 TS 错误(预期 1 个参数,但得到 2 个。)

Redux mapDispatchToProps throws TS error when rewritten from JS toTS (Expected 1 arguments, but got 2.)

我对 TS 的经验相当有限。当重写完美工作的 js 代码时

const mapDispatchToProps = (dispatch) => ({
    thunkFetchIndividualBook: (redirect, id) => dispatch(thunkFetchIndividualBook(redirect, id)),
});
    

其中thunkFetchIndividualBooks如下:


interface thunkFetchIndividualBookArgsType {
    redirect: RedirectType;
    id: string;
}
const thunkFetchIndividualBook = ({
    redirect,
    id,
}: thunkFetchIndividualBookArgsType): ThunkAction<void, RootStateType, unknown, AnyAction> => {
    return async dispatch => {
        const path = googleAPI + id;
        dispatch(fetchDetails(path));
        redirect.individualBook!();
    };
};

export default thunkFetchIndividualBook;

它告诉我们 需要 1 个参数,但得到了 2 个。 这里有什么问题?

useDispatchAction 是这样的:

const useDispatchAction = () => {
    const dispatch = useDispatch();
    return bindActionCreators(actionCreators, dispatch);
};

应该是thunkFetchIndividualBook({redirect, id}),不是thunkFetchIndividualBook(redirect, id)

也就是说,connect 是一个遗留问题 api,您现在不应该使用 connect/mapStateToProps/mapDispatchToProps,除非您正在使用遗留 class 个组件。

如果您使用函数组件,请考虑使用 useSelectoruseDispatch 挂钩。

一般来说,如果您只是在学习 Redux,并且您的课程正在展示 switch..case reducer、ACTION_TYPES 或不可变的 reducer 逻辑,那么它们不再是现代 Redux 的一部分。在这种情况下,我强烈建议您通读 the official Redux tutorial。 Modern Redux 只是代码的 1/4,具体来说与 TypeScript 一起使用要容易得多。