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

`yield call`返回类型疑问:执行Promise函数时为何类型为any?

关于redux-saga中yield call类型推断为any的问题

这个问题在redux-saga的TypeScript使用场景里其实挺常见的,我来梳理下可能的原因和解决办法:

1. 检查redux-saga的版本

旧版本的redux-saga类型定义存在不少类型推断的缺陷,尤其是在处理返回Promise的函数时。如果你用的是比较老的版本(比如v1.0.x之前),建议升级到最新的稳定版,新版本对TypeScript的支持做了不少优化,大概率能解决类型推断为any的问题。

2. 确认call的调用方式是否正确

要确保你传递给call的是函数引用,而不是已经执行后的Promise实例。比如:

  • 正确写法:yield call(f)(这里f是() => Promise<number>类型的函数)
  • 错误写法:yield call(f())(这样传递的是Promise实例,saga无法正确推断类型)

如果你的调用方式是对的,那继续往下看配置相关的问题。

3. 检查TypeScript配置

redux-saga的类型定义依赖TypeScript的严格模式配置,建议在tsconfig.json中确保以下配置:

  • 开启strict: true:这是TypeScript类型推断准确的基础,很多库的类型定义都依赖严格模式的设置
  • 开启esModuleInterop: true:避免因模块导入方式导致的类型丢失问题
  • 关闭skipLibCheck: false:如果开启了这个选项,TypeScript会跳过对库类型定义的检查,可能导致redux-saga的类型无法正常生效

4. 手动指定泛型作为临时 workaround

如果以上方法都没解决问题,可以手动给call方法指定泛型,明确返回值类型:

const result: number = yield call<number>(f);

这样就能强制TypeScript将返回结果推断为number,而不是any。

另外补充一点:redux-saga的类型系统确实存在一些边缘场景的限制,比如当函数是动态生成、或者包含复杂的泛型嵌套时,可能需要手动辅助类型推断,但常规的() => Promise<T>函数在正确配置下应该能自动推断出T类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:20:51