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

如何通过模块扩展正确为Redux-saga的select effect定义返回类型

Redux-saga select effect 自定义State类型正确配置方案
  • 问题原因
    你当前的类型扩展只声明了select方法返回无泛型的SelectEffect类型,没有将传入的selector函数返回值和SelectEffect的泛型参数做绑定,而SelectEffect的泛型值正是yield调用该effect后返回的结果类型,因此TypeScript无法识别返回的state片段类型,默认推导为any。

  • 正确的模块扩展写法
    修改你的类型声明代码如下:

import { SelectEffect, Tail } from 'redux-saga/effects';
import { IReduxState } from 'reducers/rootReducer';

declare module 'redux-saga/effects' {
  // 处理传入selector的场景
  export function select<Fn extends (state: IReduxState, ...args: any[]) => any>(
    selector: Fn,
    ...args: Tail<Parameters<Fn>>
  ): SelectEffect<ReturnType<Fn>>;

  // 处理不传入selector、直接返回完整state的场景
  export function select(): SelectEffect<IReduxState>;
}
  • 额外注意事项
    • 请将该类型声明文件放在TypeScript可识别的路径下,比如项目根目录的global.d.ts,或者确保文件路径被tsconfig.json的include数组包含。
    • 如果你的saga函数使用了ReturnType<typeof generatorFn>这类类型推导,不需要额外修改其他代码,select的返回类型会自动挂载到yield推导链中。
    • 配置完成后使用时无需手动给state标注类型,const users = yield select(state => state.users)会自动推导state为IReduxState,users为对应state片段的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:39:03