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

如何在Zod Schema内部引用自身?函数参数场景问题求助

解决Zod自引用函数Schema的类型推断问题

要实现包含自引用参数的函数的Zod Schema,直接用z.lazy()处理循环引用就可以,既能解决提前引用的报错,还能让TypeScript正确推断出包含函数属性的完整类型。

正确代码实现

import { z } from "zod";

const UserSchema = z.object({
  name: z.string(),
  isEqual: z.function()
    .args(z.lazy(() => UserSchema))
    .returns(z.boolean()),
});

type UserInference = z.infer<typeof UserSchema>;

这时候UserInference的类型会正确包含isEqual属性:

type UserInference = {
    name: string;
    isEqual: (arg0: UserInference) => boolean;
};

之前写法失效的原因

  • 第一种直接在定义里引用UserSchema的写法:JavaScript在变量声明完成前就去读取它,直接报引用错误,逻辑上根本走不通。
  • 第二种用extend的写法:TypeScript的类型推断是基于变量第一次赋值的类型,后续extend虽然修改了运行时的Schema,但类型系统没同步更新,所以UserInference只保留了初始的name属性。而z.lazy()会告诉Zod和TypeScript延迟解析这个Schema的引用,完美解决循环依赖问题,让类型推断能识别完整结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:22:05