TypeScript中如何正确定义嵌套泛型修复TS2304找不到T报错
报错原因
出现Cannot find name 'T'.ts(2304)的核心原因是:你在create<Product<T>>位置使用泛型参数T时,没有在当前作用域声明过这个类型变量,TypeScript无法识别T指代的类型。
修复方案
根据你的业务场景,选下面任意一种方案即可:
方案1:固定存储类型(单一场景用)
如果当前store只用来存固定结构的产品,直接给Product传入明确的具体类型即可,不需要保留开放泛型:
import { create } from 'zustand' type HasId = { id: number } export type Product<T extends HasId> = { product: T | null setProduct: (product: T | null) => void } // 定义你实际要存储的产品结构 type CustomProduct = HasId & { color: string // 在这里补充其他业务需要的属性 } // 直接传入具体类型,不存在未定义的T export const useProductStore = create<Product<CustomProduct>>(set => ({ product: { id: 2, color: "red" }, setProduct: product => { set({ product }) }, }))
如果只是写demo不需要严格校验额外属性,也可以快速写成create<Product<HasId & Record<string, unknown>>>,但这种写法类型安全性差,生产环境不推荐。
方案2:泛型工厂(多场景复用逻辑用)
如果你需要复用这套store逻辑,支持存储不同结构的带id产品,不要直接创建固定store,改成生成store的泛型工厂函数:
import { create } from 'zustand' type HasId = { id: number } export type Product<T extends HasId> = { product: T | null setProduct: (product: T | null) => void } // 定义工厂函数,调用时传入具体类型才生成对应类型的store export const createProductStore = <T extends HasId>(initialProduct: T | null = null) => { return create<Product<T>>(set => ({ product: initialProduct, setProduct: product => { set({ product }) }, })) } // 使用时再指定具体类型 type CustomProduct = HasId & { color: string } const useCustomProductStore = createProductStore<CustomProduct>({ id: 2, color: "red" }) // 此时product、setProduct的参数都会自动匹配CustomProduct类型,有完整类型提示
注意:泛型工厂的初始值不要硬编码固定结构,否则可能和调用时传入的T类型不匹配,最好通过工厂参数传入初始值,或者默认设为
null。
内容的提问来源于stack exchange,提问作者vuvu
相关产品推荐
相关产品推荐

