Zod架构中self的数组



我想实现以下目标:

export const MediaResponseSchema = z.object({
mediaId: z.number(),
childMedias: z.array(z.object(MediaResponseSchema)),
});

也就是说,childMedia应该被解析为我正在声明的模式的数组。

我认为提到递归类型的注释是正确的,但为了充分说明其意图,您可以使用z.lazy,然后从其定义中引用模式。你的例子会变成:

import { z } from "zod";
// Zod won't be able to infer the type because it is recursive.
// if you want to infer as much as possible you could consider using a
// base schema with the non-recursive fields and then a schema just for
// the recursive parts of your schema and use `z.union` to join then together.
interface IMediaResponse {
mediaId: number;
childMedias: IMediaResponse[];
}
const MediaResponseSchema: z.ZodType<IMediaResponse> = z.lazy(() =>
z.object({
mediaId: z.number(),
childMedias: z.array(MediaResponseSchema)
})
);

请参阅GitHub上的Zod文档,尽管我认为这应该相当于链接的内容。

只是为了回应这个评论:

这和复制粘贴整个zod对象有什么区别?

一个关键区别是,这种情况将无限期地重复出现。childMedia可以与它们自己的子媒体任意嵌套。如果您只是复制并粘贴,那么您最终只会得到一个额外的递归级别,并且在尝试决定将什么放入粘贴的childMedias时,您将面临与开始时相同的问题。

最新更新