描述
假设我们有以下一组 TypeScript 接口:
// Indexed type for type-specific fields
interface RichTextMap {
text?: { text: string };
equation?: { equation: string };
mention?: { mention: string };
}
// Main RichText interface with indexed types
interface RichTextBase {
type: "text" | "mention" | "equation";
annotations: any;
plain_text: string;
href: string | null;
}
type RichText = RichTextBase & (RichTextMap[RichTextBase["type"]] & {});
该RichText
类型应允许如下对象:
const text = {
type: "text",
annotations: {},
plain_text: "",
href: null,
text: { text: "" }
}
const mention = {
type: "mention",
annotations: {},
plain_text: "",
href: null,
mention: { mention: "" }
}
问题陈述
我需要zod
为提到的对象定义模式。
我对此的理解zod
还有待提高,但到目前为止,我已经设法想出了以下解决方案:
const RichTextSchema = z
.object({
type: z.enum(["text", "mention", "equation"]),
annotations: z.object({}).passthrough(),
plain_text: z.string(),
href: z.string().url().nullable(),
});
const TextRichTextSchema = RichTextSchema.extend({
text: z.object({ text: z.string() }).optional(),
})
const MentionRichTextSchema = RichTextSchema.extend({
mention: z.object({ mention: z.string() }).optional(),
})
const EquationRichTextSchema = RichTextSchema.extend({
equation: z.object({ equation: z.string() }).optional(),
})
现在,这种方法的问题在于,我要创建三种不同的模式,并且必须确定在运行时要调用哪一个。虽然接口类型足够通用,可以将不同的对象放在一个类型下。
问题:我想知道是否有办法更改RichTextSchema
以便能够针对上述接口类型进行验证。本质上,只保留一个验证示例中不同对象的架构对象。