gpt4 book ai didi

reactjs - 基于表单字段的zod条件验证

转载 作者:行者123 更新时间:2023-12-03 08:01:09 24 4
gpt4 key购买 nike

我有一个status = 'DRAFT' | 'READY'我的表单中的枚举字段,是否可以更改 zod 中的验证lib 基于该字段的值?

// 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"])
});

最佳答案

您使用union得出的答案是可能的。将来可能产生更好类型的另一种选择是利用 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可选,那么使用可区分联合,您可以细化为非可选类型,如果 状态“READY”

通过 union 定义,该示例中 surname 的类型将始终为 string |无论 status 的值如何,都未定义

关于reactjs - 基于表单字段的zod条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74157068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com