基于 Zod 中其他字段的必填字段

Mandatory fields based on other fields in the Zod

提问人:muhfaridzia 提问时间:11/14/2023 最后编辑:muhfaridzia 更新时间:11/14/2023 访问量:23

问:

我有这样的yup对象架构验证(简化):

因此,假设如果值为“Yes”,我想barcode_old强制执行is_change_part并且默认情况下它是 opsional。

是的,我可以这样做:

const stringRequired = yup.string().required();

export const validation = yup.object().shape({
    serial_number: stringRequired,
    barcode_old: yup.string().when('is_change_part', {
         is: (isChangePart: string) => isChangePart === 'Yes',
         then: stringRequired,
    }),
    category: stringRequired,
    sub_category: stringRequired,
    is_change_part: stringRequired
)};

如何将其转换为Zod?

我仍然对如何在 Zod 中做到这一点感到困惑,我已经这样做了,但它仍然不起作用。

编辑:我已经找到了一种方法,但是有更好的方法吗?

const stringRequired = z.string().min(1);

export const Schema = z
  .object({
    serial_number: stringRequired,
    barcode_old: z.string().optional(),
    is_change_part: stringRequired,
    category: stringRequired,
    sub_category: stringRequired,
  })
  .superRefine((val) => { 
    // make barcode_old mandatory if is_change_part === 'Yes'
    
    /* 
      This can work now, but is there a more concise and better 
      way? I think this is too verbose, I should check undefined 
      and addIssue()
    */

    if (val.is_change_part === 'Ya' && val.barcode_old === undefined) {
      ctx.addIssue({
        code: 'custom',
        message: 'mandatory',
        path: ['barcode_old'],
      });
    }
  
  });
JavaScript 验证 架构 YUP ZOD

评论


答:

0赞 Kavindu Wijesekara 11/14/2023 #1

我最近遇到了类似的挑战,想分享我使用 .discriminatedUnion

export const Schema = z.object({
  serial_number: stringRequired,
  barcode_old: z.string().optional(),
  is_change_part: z.enum(["Yes", "No"]),
  category: stringRequired,
  sub_category: stringRequired,
});

export const union = z.discriminatedUnion("is_change_part", [
  z.object({
    is_change_part: z.literal("Yes"),
    barcode_old: stringRequired,
  }),
  z.object({
    is_change_part: z.literal("No"),
  })
]);

通过此设置,您可以根据 的值轻松定义有条件地需要的字段的验证规则。is_change_part

评论

0赞 muhfaridzia 11/14/2023
这也有效,但现在它创建了单独的变量,我想将它们包装在一个架构中,就像我使用 superFine 在 Yup 或 Zod 中现有的架构验证一样(但这很详细)。