5月29日 22:40

Zustand 中如何用 TypeScript 确保类型安全?

定义 interface StoreState 声明所有状态和 action 类型,create()((set) => ...) 传入泛型。关键:set((state) => ({ count: state.count + 1 })) 这种函数式更新需要泛型才能正确推断 state 类型。Action 也写在 interface 里,类型签名一目了然。

追问

set 的类型怎么写才不报错?

set 接受 Partial | ((state: StoreState) => Partial)。用 immer middleware 时写法是 set((state) => { state.count += 1 }),不需要返回值。

selector 类型怎么保证?

useStore(s => s.count) 自动推断为 number。复杂 selector 用 shallow 比较避免重复渲染。不要写 useStore 丢失类型。

persist middleware 的泛型怎么传?

persist 单独传泛型,和 create 的泛型一致。漏传泛型会导致 set 内部类型丢失。

多个 slice 怎么组织类型?

按功能拆分文件,每个 slice 导出自己的 interface 和 create,主 store 用组合模式合并。

和 Jotai 的类型体验比呢?

Jotai 的 atom 天然类型安全,不需要额外泛型。Zustand 需要手动传泛型但更灵活。两者都能做到完全类型安全。

标签:Zustand