Базовая концепция схем валидации

В основе подхода библиотеки Yup лежит представление данных через схему — декларативное описание структуры, типов и правил допустимых значений. Схема выступает не просто набором проверок, а формальной моделью, через которую проходит любое входное значение.

Схема валидации определяет:

  • тип данных (строка, число, объект, массив и т.д.)
  • ограничения (минимум, максимум, длина, диапазон)
  • обязательность значения
  • правила преобразования
  • состав вложенных структур
  • поведение при ошибках

Такой подход переносит логику проверки из императивного кода в декларативное описание, где сама структура данных становится источником истины.

Декларативное описание вместо процедурной проверки

Классическая проверка данных в императивном стиле строится через последовательность условий:

if (!value) throw new Error("required");
if (value.length < 3) throw new Error("too short");

Схемы валидации заменяют этот подход описанием:

import * as Yup from "yup";

const schema = Yup.string()
  .required()
  .min(3);

В этом случае логика проверки становится частью структуры данных. Схема начинает описывать не процесс, а результат: какие данные считаются допустимыми.

Базовые типы схем

Каждая схема в Yup строится вокруг базового типа. Тип определяет фундаментальные правила интерпретации значения.

Строковые схемы

Строковая схема описывает текстовые значения:

  • минимальная и максимальная длина
  • обязательность
  • соответствие шаблону
  • преобразования (trim, lowercase, uppercase)
Yup.string()
  .required()
  .min(5)
  .max(20)
  .trim();

Числовые схемы

Числовая схема работает с числовыми значениями и включает:

  • диапазоны значений
  • проверку на целое число
  • ограничения знака
Yup.number()
  .required()
  .min(0)
  .max(100)
  .integer();

Булевы схемы

Булевы схемы ограничены двумя состояниями и часто используются для флагов:

Yup.boolean().required();

Объектные схемы и структура данных

Объектная схема описывает состав сложных структур. Она определяет не только тип объекта, но и правила для каждого поля:

const schema = Yup.object({
  name: Yup.string().required(),
  age: Yup.number().min(18),
});

Ключевым свойством объектной схемы является рекурсивность: каждое поле может быть собственной схемой. Это позволяет строить глубоко вложенные структуры.

Вложенные объекты

const schema = Yup.object({
  user: Yup.object({
    profile: Yup.object({
      firstName: Yup.string().required(),
    }),
  }),
});

Схема становится деревом, в котором каждая ветка обладает собственной логикой валидации.

Массивы как структурированные коллекции

Массивы описываются через схему элемента:

Yup.array()
  .of(Yup.number().min(0))
  .min(1);

Такая модель задаёт единые правила для всех элементов коллекции. При этом схема массива может включать ограничения:

  • минимальная длина
  • максимальная длина
  • уникальность элементов
  • валидация каждого элемента

Обязательность и nullable значения

Одним из ключевых аспектов схем является управление отсутствием данных.

  • required() — значение обязательно
  • nullable() — допускается null
  • defined() — исключает undefined

Эти состояния формируют отдельный слой логики поверх типов данных.

Yup.string()
  .nullable()
  .required();

Схема становится механизмом управления допустимыми состояниями отсутствия значения.

Преобразование значений (casting)

Схемы не ограничиваются проверкой, они также могут трансформировать данные:

  • преобразование строк в числа
  • нормализация регистра
  • удаление пробелов
  • приведение типов
Yup.number().transform((value, originalValue) =>
  String(originalValue).trim() === "" ? null : value
);

Таким образом схема становится частью этапа подготовки данных, а не только проверки.

Валидация как многоступенчатый процесс

Обработка данных через схему включает несколько этапов:

  1. Приведение значения к ожидаемому типу
  2. Применение трансформаций
  3. Проверка ограничений
  4. Формирование результата или ошибки

Этот процесс делает схему не просто набором правил, а конвейером обработки данных.

Контекст ошибок и путь значения

При нарушении правил схема возвращает структурированную информацию об ошибке:

  • путь до значения (path)
  • тип ошибки
  • сообщение
  • метаданные

Для вложенных объектов путь отражает структуру данных:

user.profile.firstName

Это позволяет точно локализовать источник проблемы внутри сложных структур.

Композиция схем

Схемы могут быть переиспользуемыми и комбинируемыми. Базовые схемы выносятся в отдельные определения:

const nameSchema = Yup.string().required().min(2);

const userSchema = Yup.object({
  firstName: nameSchema,
  lastName: nameSchema,
});

Композиция снижает дублирование и позволяет строить единые правила для разных частей системы.

Условная логика внутри схем

Схемы могут изменять поведение в зависимости от других значений:

Yup.string().when("isAdmin", {
  is: true,
  then: schema => schema.required(),
  otherwise: schema => schema.notRequired(),
});

Такой механизм позволяет описывать зависимые правила без выхода за пределы декларативного подхода.

Отложенная (lazy) схема

Для динамических структур используется отложенное определение:

Yup.lazy(value => {
  if (typeof value === "string") {
    return Yup.string();
  }
  return Yup.number();
});

Это позволяет адаптировать схему к форме данных во время выполнения.

Строгий режим и приведение типов

Схемы могут работать в двух режимах:

  • с автоматическим приведением типов
  • в строгом режиме без преобразований
Yup.number().strict(true);

В строгом режиме значение должно строго соответствовать типу без попыток преобразования.

Управление стратегией ошибок

Поведение схемы при ошибках влияет на структуру результата:

  • остановка на первой ошибке
  • накопление всех ошибок
  • выборочный сбор ошибок по путям

Это определяет способ анализа результата валидации и влияет на обработку данных в системе.

Роль схемы в архитектуре данных

Схема выступает центральным элементом между входными данными и бизнес-логикой. Она:

  • формализует ожидания к данным
  • снижает неопределённость входа
  • централизует правила проверки
  • обеспечивает согласованность структуры

В системах с большим количеством форм и внешних источников данных схема становится стабильной точкой контроля качества информации.