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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:45:05