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() с функцией, которая проверяет значения других полей.