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

Zustand+TypeScript使用persist中间件时如何正确为store定义类型

解决方案

你遇到的是Zustand中间件的类型推导问题,只需要调整泛型的声明方式即可,有两种可行写法:

写法1(官方推荐柯里化写法)

先给create指定状态类型,再传入被persist包装的创建函数,TS会自动完成类型匹配:

import { create } from 'zustand';
import { persist } from 'zustand/middleware';

interface CartState {
  cart: { [id: string]: CartDto };
  addItem: ({ id, image, name, price }: Omit<CartDto, "quantity">) => void;
  removeItem: (id: string) => void;
  reset: () => void;
}

export const useCart = create<CartState>()(
  persist(
    (set, get) => ({
      cart: {},
      addItem: ({ id, image, name, price }) => {
        set(() => {
          const cart = get().cart;
          if (!cart[id]) {
            cart[id] = {
              id,
              image,
              name,
              price,
              quantity: 0
            };
          }
          cart[id].quantity += 1;
          return { cart };
        });
      },
      removeItem: (id) => {
        set(() => {
          const cart = get().cart;
          if (!cart[id]) {
            return { cart };
          }
          const newQuantity = cart[id].quantity - 1;
          if (newQuantity <= 0) {
            delete cart[id];
          } else {
            cart[id].quantity = newQuantity;
          }
          return { cart };
        });
      },
      reset: () => {
        set(() => {
          return { cart: {} };
        });
      }
    }),
    {
      name: "cart",
      getStorage: () => localStorage
    }
  )
);

写法2(给persist指定泛型)

直接把状态类型传给persist方法,不需要给create加泛型:

export const useCart = create(
  persist<CartState>(
    (set, get) => ({
      // 同上原有逻辑不变
    }),
    {
      name: "cart",
      getStorage: () => localStorage
    }
  )
);

原因说明

原来的写法报错是因为persist包装后的状态创建函数类型和create<CartState>直接要求的参数类型不匹配,persist会给store注入内置的持久化相关属性,需要通过上述两种写法让TS正确推导中间件处理后的类型,无需手动声明StoreApiWithPersist这类内部类型。


内容的提问来源于stack exchange,提问作者user3887366

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:24:04