提问人:muhfaridzia 提问时间:11/14/2023 最后编辑:muhfaridzia 更新时间:11/14/2023 访问量:23
基于 Zod 中其他字段的必填字段
Mandatory fields based on other fields in the Zod
问:
我有这样的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'],
});
}
});
答:
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 中现有的架构验证一样(但这很详细)。
评论