如何解析Zod来判断字段是否为必填字段?

问题描述 投票:0回答:2

我想知道是否可以使用 Zod 来确定何时需要字段,以便我可以将此布尔值传递给输入,例如

<input required={/* Use Zod to determine this value */} />
。我问的主要原因是出于样式目的,例如在需要字段时显示
*

const Component = () => {
  const schema = z.object({
    name: z.string(),
    address: z.string().optional(),
  });

  type FormValues = z.infer<typeof schema>;

  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<FormValues>({
    defaultValues: {
      name: '',
      address: undefined,
    },
    resolver: zodResolver(schema),
  });

  const onSubmit = handleSubmit((data) => console.log(data));

  return (
    <form onSubmit={onSubmit}>
      <input
        {...register('name', {
          required: /* Use Zod to determine this value */,
        })}
      />
      {errors?.name && <p>{errors.name.message}</p>}

      <input {...register('address'{
          required: /* Use Zod to determine this value */,
        })}
      />

      <input type="submit" />
    </form>
  );
};
react-hook-form zod
2个回答
8
投票

一种选择是仅检查模式是否为

instanceof
z.ZodOptional
。例如,

const schema = z.number().optional();
// ...

<input required={!(schema instanceof z.ZodOptional)} />

就您而言,您使用

z.object
作为
schema
,因此您可以查看
shape
字段
,例如:

<input required={!(schema.shape.name instanceof z.ZodOptional)} />

这是利用了

.optional()
将内部模式包装在
ZodOptional
实例中这一事实。如果您有进一步的改进,您最终可能会得到一个内部可选的
ZodEffect
(或其他东西)。在不深入处理所有类型的情况下,似乎没有第一方支持反映字段的类型,但如果您知道它不会是
ZodEffect
,您至少可以从架构中的字段派生它。


0
投票

我相信你可以调用

.isOptional()
方法。

<input required={!schema.shape.name.isOptional()} />
<input required={!schema.shape.address.isOptional()} />
© www.soinside.com 2019 - 2024. All rights reserved.