You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Redux-Thunk与TypeScript时connect出现类型错误

解决Redux-Thunk + TypeScript中connect注入Thunk Action Creator的类型错误

这个类型错误的核心原因很明确:TypeScript默认的Dispatch类型只认标准Action(必须带type属性的对象),但Thunk Action Creator返回的是一个函数,不是普通Action。我们需要用Redux-Thunk提供的专属类型来告诉TypeScript“这个dispatch可以处理函数形式的Thunk”。

结合你给出的代码和依赖版本,我给你一步步的修正方案:

1. 修正Action与Action Creator的类型定义

首先要导入Redux-Thunk提供的ThunkAction类型,用来正确标记你的Thunk Action Creator:

import { Action, ThunkAction } from 'redux';
import { Dispatch } from 'react-redux';

export enum TestActionTypes { THUNK_ACTION = "THUNK_ACTION" }
// 定义标准Action类型
export interface ThunkActionInterface extends Action<TestActionTypes.THUNK_ACTION> {}
export type TestAction = ThunkActionInterface;

// 用ThunkAction标记返回值,明确这是一个Thunk
export function thunkActionCreator(): ThunkAction<void, any, unknown, TestAction> {
  return function(dispatch: Dispatch<TestAction>) {
    dispatch({ type: TestActionTypes.THUNK_ACTION });
  };
}

这里ThunkAction的四个泛型参数分别是:

  • void:Thunk函数的返回值类型(你这里没有返回值,所以用void)
  • any:你的Store State类型(建议后续替换成实际的RootState类型,不要用any)
  • unknown:Thunk的额外参数(如果不需要可以用unknown)
  • TestAction:这个Thunk可以dispatch的标准Action类型

2. 修正mapDispatchToProps中的Dispatch类型

接下来要把mapDispatchToProps里的Dispatch<any>换成Redux-Thunk的ThunkDispatch,让TypeScript知道这个dispatch能处理Thunk函数:

import { ThunkDispatch } from 'redux-thunk';

// ... 其他代码保持不变 ...

function mapDispatchToProps(dispatch: ThunkDispatch<any, unknown, TestAction>): DispatchProps {
  return { testThunk: () => dispatch(thunkActionCreator()) };
}

ThunkDispatch的三个泛型参数对应:

  • any:Store State类型
  • unknown:Thunk额外参数
  • TestAction:支持的标准Action类型

3. 更简洁的写法:用bindActionCreators

如果你不想手动处理dispatch的类型,也可以用bindActionCreators,它会自动适配Thunk的类型:

import { bindActionCreators } from 'redux';

function mapDispatchToProps(dispatch: ThunkDispatch<any, unknown, TestAction>): DispatchProps {
  return bindActionCreators({ testThunk: thunkActionCreator }, dispatch);
}

额外建议:避免使用any

虽然上面的代码用了any来适配你的现有代码,但实际项目中建议定义明确的RootState类型,替换掉所有any,这样TypeScript的类型检查才能发挥最大作用。比如:

// 假设你的RootState是这样的
interface RootState {
  // 你的state结构
}

// 然后在ThunkAction和ThunkDispatch中替换any为RootState
export function thunkActionCreator(): ThunkAction<void, RootState, unknown, TestAction> {
  // ...
}

function mapDispatchToProps(dispatch: ThunkDispatch<RootState, unknown, TestAction>): DispatchProps {
  // ...
}

这样修改后,TypeScript就不会再报错了,因为它现在知道你的dispatch可以接收Thunk函数类型的参数,而不仅仅是标准Action对象。

内容的提问来源于stack exchange,提问作者vbvx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:20:40