首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结束zod验证以供重用

结束zod验证以供重用
EN

Stack Overflow用户
提问于 2022-07-05 10:24:24
回答 1查看 1.5K关注 0票数 1

我正在研究一种类似于我同事的表格,还有一些额外的领域。我已经取得了他的zodObject,并扩展了它的额外字段。

他正在使用大量的.refine调用来验证他的表单,但是我想包装这个逻辑并在我的表单上使用它。

提取逻辑的最佳方法是什么,这样我们都可以使用它?

例如,对车辆进行验证,并对汽车对象进行扩展:

代码语言:javascript
复制
export const vehicleZodObject = z.object({
  name: z.string(),
  engine: type: z.enum(['electric', 'combustion']),
})


export const carZodObject = vehicleObject.extend({
  wheels: z.number().min(4),
})

他有许多refine调用被链接到他的vehicle对象上,如下所示:

代码语言:javascript
复制
 .refine((data) => isUnique(data.name), {
      message: 'Characters must be unique',
    })

我需要能够捆绑这些精炼链,并在两个zod对象上使用它们。

EN

回答 1

Stack Overflow用户

发布于 2022-07-07 04:18:11

确切地说什么是最好的方法有点困难,因为我认为有几个选择。

首先,我建议将改进尽可能地局限于它们应用的领域。例如,与其对整个对象调用refine,不如在z.string()上为name字段调用name

代码语言:javascript
复制
export const vehicleZodObject = z.object({
  name: z.string().refine(isUnique, { message: 'Characters must be unique' },
  engine: type: z.enum(['electric', 'combustion']),
});

接下来,可以定义一个帮助函数,它将细化应用于它所传递的模式。您可以使用两个模式共享的接口来设置它,然后在提交的模式上调用refine函数:

代码语言:javascript
复制
import { z } from "zod";

interface IShared {
  a: string;
  b: string;
}

function attachRefinements<O extends IShared, T extends z.ZodTypeDef, I>(
  schema: z.ZodType<O, T, I>
) {
  return schema.refine((shared) => shared.a !== shared.b, {
    message: "a and b must be unique"
  });
}

const schema1 = attachRefinements(
  z.object({
    custom: z.boolean(),
    a: z.string(),
    b: z.string()
  })
);

const schema2 = attachRefinements(
  z.object({
    a: z.string(),
    b: z.string(),
    special: z.number()
  })
);

即使在这种情况下,我也建议创建一个只有ab字段的a模式,将细化添加到base模式中,然后使用z.intersection构建schema1schema2。这与这样的原则是一致的,即细化尽可能接近它适用的地方。

代码语言:javascript
复制
const base = z.object({
  a: z.string(),
  b: z.string(),
}).refine((x) => x.a !== x.b, {
  message: 'a and b must be unique',
});

const schema1 = z.intersection(base, z.object({
  custom: z.boolean(),
});
const schema2 = z.intersection(base, z.object({
  special: z.number()
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72867815

复制
相关文章

相似问题

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