如何将Zod Schema作为其他Schema属性?循环引用报错求助
解决Zod循环引用导致的TS7022错误
你遇到的问题是循环引用引发的类型推断失败:PayPalManagerSchema依赖CurrencySchema,而CurrencySchema又反向依赖PayPalManagerSchema,TypeScript解析时无法确定两者的初始化顺序,因此抛出了类型隐含为any的错误。
解决核心是使用Zod提供的**z.lazy()方法**,它允许延迟对目标Schema的引用,直到实际需要验证时才求值,以此避开循环初始化的冲突。
修改后的代码示例
1. 调整PayPalManagerSchema文件
import { z } from 'zod'; import { CurrencySchema, ManagerPaymentSchema } from '.'; export const PayPalManagerSchema = z.object({ id: z.number().int(), name: z.string(), // 用z.lazy()延迟引用CurrencySchema currency: z.lazy(() => CurrencySchema), paypal_link: z.string(), payments: z.array(ManagerPaymentSchema) });
2. 调整CurrencySchema文件
import { z } from 'zod'; import { PayPalManagerSchema } from '.'; export const CurrencySchema = z.object({ idCurrency: z.number().int(), nameCurrency: z.string(), symbolCurrency: z.string(), codeCurrency: z.string().default('GBP'), // 用z.lazy()延迟引用PayPalManagerSchema paypalManagers: z.array(z.lazy(() => PayPalManagerSchema)) });
原理说明
z.lazy()接收一个返回Schema的函数,只有当Zod需要验证对应字段时,才会执行该函数获取目标Schema。这种延迟求值的方式打破了两个Schema之间的循环初始化依赖,让TypeScript能正确推断出各自的类型,彻底消除TS7022错误。
内容的提问来源于stack exchange,提问作者Gerardo Gonzalo Nuez Bello
相关产品推荐
相关产品推荐

