我的表单中有一个status = 'DRAFT' | 'READY'枚举字段,是否可以根据该字段的值更改zod库中的验证?
// validation passed
{
name: "John",
surname: null,
status: "DRAFT"
}
// validation failed
{
name: "John",
surname: null,
status: "READY"
}所以如果status === "READY"从这里删除.min(1)
const schema = z.object({
name: z.string(),
surname: z.string().min(1),
status: z.enum(["READY", "DRAFT"])
});发布于 2022-10-22 06:02:32
您想出的使用unions的答案是可能的。在未来可能产生更好类型的另一种选择是利用zod的discriminatedUnion模式:
// placing shared fields in one place to avoid repetition
const base = z.object({
name: z.string(),
});
const schema = z.discriminatedUnion(
'status',
[
z.object({
status: z.literal("DRAFT"),
surname: z.string(),
}).merge(base),
z.object({
status: z.literal("READY"),
surname: z.string().min(1),
}).merge(base),
],
);在这种情况下,我相信您最终会得到与直接使用union相同的推断类型,但是,这种方法对您可能想要区分的其他更改具有更强的弹性。例如,如果DRAFT对象允许surname为optional,那么使用受歧视的联合,如果status是"READY",则可以将其细化为非可选类型。
对于union定义,该示例中surname的类型始终是string | undefined,而不管status的值如何。
发布于 2022-10-21 17:29:03
这行得通
const schema = z.union([
z.object({
name: z.string(),
surname: z.string(),
status: z.literal("DRAFT"),
}),
z.object({
name: z.string(),
surname: z.string().min(1),
status: z.literal("READY"),
}),
]);https://stackoverflow.com/questions/74157068
复制相似问题