我想知道是否可以使用 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>
);
};
一种选择是仅检查模式是否为
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
,您至少可以从架构中的字段派生它。
我相信你可以调用
.isOptional()
方法。
<input required={!schema.shape.name.isOptional()} />
<input required={!schema.shape.address.isOptional()} />