Sobes.tech
Back to questions
Middle
2

Как в Zod организовать схему для многошаговой формы? Как обрабатывать условную валидацию?

Companies where asked
UserGate

Answer from AI

sobes.tech AI

В Zod для многошаговой формы обычно создают отдельные схемы для каждого шага, а затем объединяют их по мере необходимости. Для условной валидации можно использовать метод .refine() или .superRefine(), а также условные конструкции внутри схемы.

Пример организации схемы для двухшаговой формы с условной валидацией:

import { z } from 'zod';

const step1Schema = z.object({
  name: z.string().min(1, "Имя обязательно"),
  age: z.number().int().positive(),
});

const step2Schema = z.object({
  hasPet: z.boolean(),
  petName: z.string().optional(),
}).superRefine((data, ctx) => {
  if (data.hasPet && (!data.petName || data.petName.trim() === '')) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      message: "Имя питомца обязательно, если есть питомец",
      path: ["petName"],
    });
  }
});

// Объединённая схема для всей формы
const fullSchema = step1Schema.merge(step2Schema);

Такой подход позволяет валидировать каждый шаг отдельно и применять условные проверки, например, если поле hasPet истинно, то petName обязательно. Метод superRefine даёт доступ к всей структуре данных и позволяет добавлять кастомные ошибки.

Для динамической валидации можно также использовать .refine() с функцией, которая проверяет значения других полей.