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

在Zustand的create方法中使用泛型的实现困惑

解决Zustand泛型Store的单例与类型传递问题

你需要在保持Zustand Store单例的前提下,给它传递泛型类型,同时保证选中行的类型安全,以下是可行的解决方案:

步骤1:修正初始状态的类型约束

先给initialState加上明确的类型定义,避免空数组导致的类型推断异常:

interface MainGridState<T> {
  selectedRows: Array<GridRow<T>>
}

// 用never作为初始泛型,确保初始状态的类型兼容性
const initialState: MainGridState<never> = {
  selectedRows: []
}

步骤2:创建单例泛型Store

创建Store时使用unknown作为基础泛型,既能保持单例,又能后续通过泛型约束细化类型:

import { create } from 'zustand'

// 仅创建一次单例Store,基础类型设为MainGridState<unknown>
const useMainGridStore = create<MainGridState<unknown>>()(set => ({
  ...initialState,
  // 可在这里定义修改状态的方法,比如:
  setSelectedRows: (rows: Array<GridRow<unknown>>) => set({ selectedRows: rows })
}))

步骤3:封装泛型Hook做类型转换

通过自定义泛型Hook,将Store的unknown类型转换为业务需要的具体泛型T,保证类型安全:

export const useMainGridSelectedRows = <T>(): Array<GridRow<T>> => {
  // 用类型断言将unknown转换为T,业务层会传递正确的泛型,确保类型匹配
  return useMainGridStore(state => state.selectedRows as Array<GridRow<T>>)
}

// 如果需要修改选中行,也可以封装对应的泛型Hook
export const useMainGridSetSelectedRows = <T>() => {
  return useMainGridStore(state => 
    (rows: Array<GridRow<T>>) => state.setSelectedRows(rows as Array<GridRow<unknown>>)
  )
}

使用示例

在业务组件中直接调用泛型Hook即可:

// 假设表格数据类型为User
interface User {
  id: string
  name: string
}

// 获取选中行,类型自动推导为Array<GridRow<User>>
const selectedRows = useMainGridSelectedRows<User>()

// 设置选中行
const setSelectedRows = useMainGridSetSelectedRows<User>()
setSelectedRows([{ id: '1', data: { id: '1', name: '张三' } }])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:13:27