如何从现有实体推断Redux子Store分组的带Payload的完整动作映射?
问题:在复合Redux Store中自动推断子Store对应的Action类型映射
摘要:在复合Redux Store中,能否从已有实体(如类型化的store实例、各子Store的action模块)自动推断出包含所有子Store及其对应action(含参数类型)的ActionsMap类型,无需手动重复维护关联关系?
场景与目标
我已经搭建了一个包含多个子Store的Redux Store,核心action如下:
setAppLoading(isLoading: boolean):用于更新state.app.loading为传入的布尔值setUserName(name: string | null):用于更新state.user.name,支持传入null(比如用户未登录时)logOut():执行API操作后,调用setUserName(null)完成登出
我希望自动推断出如下结构的ActionsMap类型,避免手动重复定义导致漏写:
interface ActionsMap { app: { setAppLoading(isLoading: boolean): void } user: { setUserName(name: string | null): void logOut(): void } }
现有条件
- 已类型化的Store实例:通过
configureStore()和combineReducers()创建的store已正确类型化,并且能从中推断出所有子Store的名称:
type State = ReturnType<typeof store.getState> // 过滤掉内部的`$CombinedState`键,得到子Store名称集合 type SubStoreName = Extract<keyof State, string>
- 独立的Action模块:每个子Store的action都单独维护在模块中,已正确类型化,可直接用于
dispatch:
import * as appActions from 'store/app/actions' import * as userActions from 'store/user/actions' dispatch(appActions.setAppLoading(true)) dispatch(userActions.logOut())
当前方案与痛点
我目前能实现目标的最接近方案是手动创建一个actionsMap对象,再通过它推断类型:
const actionsMap = { app: appActions, user: userActions, } satisfies Record<SubStoreName, unknown> type ActionsMap = typeof actionsMap
但这个方案需要手动将每个子Store的action模块添加到actionsMap中,属于重复维护的工作,很容易出现新增action模块后忘记同步到actionsMap的情况。
请问有没有办法从现有实体自动推断出目标的ActionsMap类型,无需手动维护这个映射对象?
内容的提问来源于stack exchange,提问作者Parzh
相关产品推荐
相关产品推荐

