`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
相关产品推荐
相关产品推荐

