5月29日 01:38

Zustand 中如何用 TypeScript 定义 Store 类型?

定义一个包含状态和方法的 interface,作为 create 的泛型参数传入即可:create((set, get) => ({...}))。TypeScript 会自动推断 set 回调中 state 的类型,方法参数也能正确约束。关键点:状态和方法写在同一个 interface 中,方法参数可引用自身类型(如 setUser: (user: StoreState['user']) => void)。

追问

中间件会改变 store 类型,怎么处理类型组合? persist/devtools 等中间件会向 store 注入额外属性(如 persist.clearStorage),需定义扩展类型 type Store = StoreState & StorePersist,再用 create() 包裹。zustand v4+ 的中间件泛型签名已支持自动推断,大部分场景无需手动拼接。

StateCreator 泛型怎么用? StateCreator<StoreState, Mutators, U> 用于拆分 store 逻辑时约束每个切片的类型,Mutators 描述中间件链对 set/get 的改写,U 是未包装的原始类型。手动组合切片时需要用到。

selector 的返回类型怎么保证? useStore(s => s.count) 自动推断为 number。自定义 selector 返回派生值时,TypeScript 能推断返回类型;如果需要显式标注,写 useStore((s) => s.items.length)。

泛型 store 怎么定义? function createSlice() 返回 StateCreator<SliceState>,通过泛型参数让切片适配不同实体(如 createSlice()、createSlice()),避免为每个实体写重复逻辑。

set 的 partial 参数类型为什么不是 Partial set 接受 Partial 或 (state) => Partial,但嵌套对象是浅合并,深层更新需展开:set(s => ({ user: { ...s.user, name: 'new' } })),否则丢失同级字段。

写段代码

ts
interface BearState { bears: number inc: (n: number) => void } const useBearStore = create<BearState>((set) => ({ bears: 0, inc: (n) => set((s) => ({ bears: s.bears + n })), })) // 组件中 const bears = useBearStore((s) => s.bears) // number
标签:ReactZustand