如何从同级属性推导Zod Schema的类型?
问题原因与解决方法
问题根源
你在声明myEntry时直接使用了TransformEntry的默认泛型参数ZodType,而ZodInfer<ZodType>的结果就是any,所以transform的参数被解析成了any。当你不手动指定泛型参数时,TypeScript会 fallback 到默认的ZodType,没法从schema的具体结构自动推导对应的类型。
解决方法
有两种简单的修复方式:
直接去掉变量的类型标注
让TypeScript自动根据schema的类型推导泛型参数,这样transform的参数类型就会和schema匹配:import { z, ZodType, infer as ZodInfer } from "zod"; type TransformEntry<T extends ZodType = ZodType> = { schema: T; transform: (value: ZodInfer<T>) => void; }; const myEntry = { schema: z.object({ firstName: z.string() }), transform: (value) => { // value现在的类型是{ firstName: string },类型提示正常 console.log(value.firstName); } }用工厂函数约束类型并自动推导
如果需要严格约束变量必须符合TransformEntry类型,可以创建一个工厂函数,让它帮你自动推导泛型:import { z, ZodType, infer as ZodInfer } from "zod"; type TransformEntry<T extends ZodType = ZodType> = { schema: T; transform: (value: ZodInfer<T>) => void; }; function createTransformEntry<T extends ZodType>(entry: TransformEntry<T>) { return entry; } const myEntry = createTransformEntry({ schema: z.object({ firstName: z.string() }), transform: (value) => { // value类型正确解析为{ firstName: string } } });
内容的提问来源于stack exchange,提问作者Jim Heising
相关产品推荐
相关产品推荐

