我要做到以下几点:
export const MediaResponseSchema = z.object({
mediaId: z.number(),
childMedias: z.array(z.object(MediaResponseSchema)),
});也就是说,应该将childMedia解析为我声明的模式的数组。是可能的吗?
发布于 2022-09-24 03:33:58
我认为提到递归类型的注释是正确的,但是要充分说明所要做的是什么,您可以使用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中时,您就会遇到相同的问题。
https://stackoverflow.com/questions/73827046
复制相似问题