ค้นหาเว็บไซต์

typescript - เมื่อมีสคีมา zod ที่มีการรวมแบบ discriminated union เราจะปรับปรุงฟอร์มให้เป็นชนิด discriminated type ได้อย่างไร?


เมื่อกำหนดสคีมาที่เป็นยูเนียนที่มีตัวแยก ฉันต้องการที่จะสามารถจำกัดประเภทของฟอร์มตามตัวแยก อย่างไรก็ตาม การพยายามใช้ตัวป้องกันประเภทด้วย watch หรือ getValues นั้นไม่สามารถใช้งานได้

เป็นไปได้หรือไม่ที่จะปรับปรุงประเภทของ form ให้เป็นประเภทย่อยที่เฉพาะเจาะจงมากขึ้น?

const BazSchema = z.object({
  type: z.literal('baz'),
  baz: z.string(),
});
type BazSchema = z.infer<typeof BazSchema>;
const BarSchema = z.object({
  type: z.literal('bar'),
  bar: z.string(),
});
type BarSchema = z.infer<typeof BarSchema>;

const Schema = z.discriminatedUnion('type', [BazSchema, BarSchema]);

type Schema = z.infer<typeof Schema>;

export function MyComponent() {
  const form = useForm<Schema>({
    defaultValues: {
      type: 'baz',
    },
  });

  const type = form.watch('type');
  if (type === 'baz') {
    return <BazForm form={form} />;
  }
}

export function BazForm({ form }: { form: UseFormReturn<BazSchema> }) {
  return (
    <form {...form}>
      <input {...form.register('baz')} />
    </form>
  );

}

Codesandbox: https://codesandbox.io/p/sandbox/zod-discriminated-union-mpxn4h?file=%2Fsrc%2FApp.tsx