首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于表单字段的zod条件验证

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

Stack Overflow用户
提问于 2022-10-21 17:11:38
回答 2查看 83关注 0票数 1

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

代码语言:javascript
复制
// validation passed
{
  name: "John",
  surname: null,
  status: "DRAFT"
}

// validation failed
{
  name: "John",
  surname: null,
  status: "READY"
}

所以如果status === "READY"从这里删除.min(1)

代码语言:javascript
复制
const schema = z.object({
  name: z.string(),
  surname: z.string().min(1),
  status: z.enum(["READY", "DRAFT"])
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-22 06:02:32

您想出的使用unions的答案是可能的。在未来可能产生更好类型的另一种选择是利用zod的discriminatedUnion模式:

代码语言:javascript
复制
// 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对象允许surnameoptional,那么使用受歧视的联合,如果status"READY",则可以将其细化为非可选类型。

对于union定义,该示例中surname的类型始终是string | undefined,而不管status的值如何。

票数 1
EN

Stack Overflow用户

发布于 2022-10-21 17:29:03

这行得通

代码语言:javascript
复制
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"),
  }),
]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74157068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档