如何在Zustand中获取Store属性时保留原有类型?
解决Zustand useGetStates返回类型为any的问题
问题核心在于原useGetStates函数未通过泛型绑定传入的具体状态键,导致TypeScript无法推断返回对象的精确类型。通过泛型约束可以完美解决这个问题,让函数根据传入的键自动推导对应原始类型:
修改后的useGetStates实现
type StateType = keyof DatasetSlice | keyof GlobalSlice type Slices = GlobalSlice & DatasetSlice const setStore = set => ({ ...datasetSlice(set), ...globalSlice(set), }) const useStore = create(devtools<Slices>(setStore, { enabled: true, name: 'Core store' })) // 新增泛型K,约束为StateType的子集,让TS捕获具体传入的键 export const useGetStates = <K extends StateType>(stateKeys: K[]) => useStore( state => stateKeys.reduce((acc, key) => { acc[key] = state[key] return acc }, {} as Pick<Slices, K>), shallow )
用法示例
调用时TypeScript会自动推导返回对象的类型,不再是any:
const { backButtonTarget, invitedUsers } = useGetStates(['backButtonTarget', 'invitedUsers']) // backButtonTarget 和 invitedUsers 会严格保留它们在DatasetSlice/GlobalSlice中定义的原始类型
可选写法(保留Object.assign)
如果你想继续使用原Object.assign的逻辑,只需给返回值添加类型断言即可:
export const useGetStates = <K extends StateType>(stateKeys: K[]) => useStore( state => Object.assign( {}, ...stateKeys.map(stateKey => ({ [stateKey]: state[stateKey] })) ) as Pick<Slices, K>, shallow )
内容的提问来源于stack exchange,提问作者podeig
相关产品推荐
相关产品推荐

