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

TypeScript中如何为传入redux-saga的history对应action定义类型?

Saga Action类型定义解决方案

前置依赖类型说明

你需要用到两个核心类型:

  • History:react-router-dom内置的history实例类型,完全匹配useHistory()的返回值
  • ReturnType:TypeScript内置的工具类型,用于推导函数的返回值类型
    如果你的项目用了Redux Toolkit,也可以直接用内置的PayloadAction类型辅助定义。

步骤1:补全action.ts的类型定义

优先给action creator加上类型约束,后续saga的类型可以直接复用,避免重复定义:

import { History } from 'react-router-dom';
import { createAction } from '@reduxjs/toolkit';

// 直接指定createAction的payload类型为History,建议去掉多余的嵌套层
export const recievingHistoryAsPayload = createAction<History>(
  Types.RECEIVING_HISTORY_AS_PAYLOAD
);

优化提示:你之前的代码多包了一层{ payload: history },直接传history实例作为参数更简洁,对应组件内的dispatch调用改为:

dispatch(recievingHistoryAsPayload(history));

步骤2:给saga的action参数指定类型

直接通过action creator的类型推导返回的action类型,不需要手动写接口,维护成本更低:

import { call } from 'redux-saga/effects';
import { recievingHistoryAsPayload } from './action';

// 用ReturnType推导action的精确类型,替换any
export function* recievingHistoryAsPayloadSaga(
  action: ReturnType<typeof recievingHistoryAsPayload>
): Generator {
  // 注意:直接传push方法会丢失this指向,建议用箭头函数包裹避免调用报错
  yield call(() => action.payload.push('/'));
}

保留原有嵌套结构的兼容方案

如果不想修改现有{ payload: history }的传参格式,只需要调整action creator的类型定义即可:

// action.ts中修改类型定义
export const recievingHistoryAsPayload = createAction<{ payload: History }>(
  Types.RECEIVING_HISTORY_AS_PAYLOAD
);

对应saga中取history的写法为action.payload.payload.push。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:18:02