如何通过模块扩展正确为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片段的类型。
- 请将该类型声明文件放在TypeScript可识别的路径下,比如项目根目录的
内容的提问来源于stack exchange,提问作者stackoverflow
相关产品推荐
相关产品推荐

