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

如何从同级属性推导Zod Schema的类型?

问题原因与解决方法

问题根源

你在声明myEntry时直接使用了TransformEntry的默认泛型参数ZodType,而ZodInfer<ZodType>的结果就是any,所以transform的参数被解析成了any。当你不手动指定泛型参数时,TypeScript会 fallback 到默认的ZodType,没法从schema的具体结构自动推导对应的类型。

解决方法

有两种简单的修复方式:

  1. 直接去掉变量的类型标注
    让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);
        }
    }
    
  2. 用工厂函数约束类型并自动推导
    如果需要严格约束变量必须符合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:54:55