使用泛型Const定义Zod枚举时TypeScript报错,如何正确转换?
解决Zod泛型枚举中TypeScript提示
data属性不存在的问题 这个问题的核心是TypeScript无法正确推断Zod对象schema的类型,导致transform方法里的参数类型识别错误。以下是两种可行的解决方式:
方法一:用as const帮助Zod捕获精确枚举类型
在z.enum的参数上添加as const,让TypeScript将数组视为字面量类型,Zod就能正确生成对应的枚举schema,进而推断出对象的完整结构:
import { z } from 'zod'; function objectWithGenericEnum<T extends string>( options: readonly [T, ...T[]] ) { const objSchema = z.object({ data: z.enum(options as const), }); return objSchema.transform(v => v.data); }
方法二:显式标注对象schema的类型
如果不想用as const,可以手动指定z.object的类型,强制TypeScript识别出对象包含data属性:
import { z } from 'zod'; function objectWithGenericEnum<T extends string>( options: readonly [T, ...T[]] ) { const enumSchema = z.enum(options); const objSchema = z.object({ data: enumSchema, }) as z.ZodObject<{ data: typeof enumSchema }>; return objSchema.transform(v => v.data); }
两种方法都能让TypeScript正确识别transform参数中的data属性,解决报错问题。
内容的提问来源于stack exchange,提问作者Andrew Kevich
相关产品推荐
相关产品推荐

