Базовые типы данных

Библиотека YupResolver выступает связующим звеном между схемой валидации, построенной на Yup, и механизмами управления формами, чаще всего используемыми через React Hook Form. Основой корректной работы схем становятся базовые типы данных, поскольку именно они определяют структуру входных значений, правила преобразования и поведение валидатора при получении данных из формы.

Строгая типизация на уровне схемы позволяет формировать предсказуемую модель данных, в которой каждое поле заранее описано с точки зрения типа, ограничений и допустимых значений. В контексте YupResolver эти определения напрямую влияют на результат валидации и формат ошибок, возвращаемых в форму.


Строковые поля являются наиболее часто используемым типом в схемах Yup. Они определяются через yup.string() и представляют собой базовый контейнер для текстовых данных.

Ключевые особенности строковых типов:

  • поддержка обязательности значения через required()
  • ограничение длины через min() и max()
  • проверка соответствия регулярным выражениям через matches()
  • преобразование входных значений в строку при необходимости

Строковая схема часто используется для полей имени, email, пароля, комментариев и любых текстовых данных, поступающих из пользовательского ввода.

Пример логики поведения:

  • пустая строка при наличии required() считается ошибкой
  • значение null или undefined требует явной обработки через nullable() или optional()
  • пробельные символы могут учитываться или игнорироваться в зависимости от трансформации

YupResolver при обработке строковых схем передаёт результат в форму в виде структурированных ошибок, связанных с конкретным полем, без изменения исходного типа данных.


Числовые значения

Числовой тип определяется через yup.number() и используется для обработки количественных данных, таких как возраст, цена, рейтинг, количество элементов.

Особенности числовых схем:

  • автоматическое приведение строкового ввода к числу при возможности
  • проверка на NaN как на невалидное значение
  • ограничения диапазона через min() и max()
  • возможность проверки целочисленных значений через integer()

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

YupResolver фиксирует результат преобразования и передаёт либо корректное число, либо сообщение об ошибке, связанное с типом или диапазоном.


Булевы значения

Булевый тип задаётся через yup.boolean() и используется для флагов состояния: чекбоксов, переключателей, согласий.

Особенности обработки:

  • значение может быть true, false, либо undefined
  • отсутствие значения часто интерпретируется как false, если не задано иное поведение
  • поддерживается принудительная проверка через oneOf([true]), например для обязательного согласия

Булевы поля важны в формах с юридическими подтверждениями, настройками и переключателями функционала.

При использовании YupResolver булевое значение сохраняет свой тип без преобразования, но может проходить через стадию нормализации в зависимости от источника данных формы.


Дата и время

Дата описывается через yup.date() и предназначена для работы с объектами Date.

Ключевые аспекты:

  • автоматическое преобразование строк в дату при валидном формате
  • проверка на Invalid Date
  • сравнение дат через min() и max()
  • поддержка обязательных и необязательных значений

При работе с формами дата часто поступает в виде строки ISO или локального формата. Yup пытается интерпретировать такие значения в объект Date, после чего применяется валидация.

YupResolver возвращает либо корректный объект Date, либо ошибку, связанную с невозможностью преобразования или нарушением ограничений диапазона.


Массивы

Массивы определяются через yup.array() и представляют собой структуру для хранения списков однотипных или сложных значений.

Особенности массивов:

  • обязательное указание типа элементов через of()
  • поддержка вложенной валидации каждого элемента
  • проверка минимального и максимального количества элементов через min() и max()
  • возможность валидации пустых массивов

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

Поведение YupResolver в случае массивов заключается в рекурсивной проверке каждого элемента и агрегировании ошибок по индексам массива, что позволяет точно локализовать проблему внутри структуры данных.


Объекты

Объектные схемы задаются через yup.object() и представляют основную структуру формы.

Особенности:

  • описание структуры через shape({})
  • вложенные схемы для каждого поля
  • поддержка глубокой вложенности объектов
  • возможность частичной валидации через partial() в комбинации с TypeScript

Объекты позволяют формировать сложные модели данных, включая адреса, профили пользователей, настройки.

YupResolver при обработке объектов сохраняет иерархию ошибок, привязывая каждую ошибку к конкретному пути в структуре, например user.address.city.


Универсальные значения (mixed)

Тип mixed() используется для значений, которые не имеют строго определённого типа или могут изменяться динамически.

Особенности:

  • возможность принимать любые типы данных
  • применение пользовательских правил через test()
  • гибкость при описании нестандартных структур

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

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


Nullable и optional значения

Механизмы nullable() и optional() определяют поведение отсутствующих значений.

  • nullable() допускает значение null
  • optional() допускает undefined
  • комбинация позволяет явно контролировать состояние пустоты поля

Эти модификаторы критически важны при работе с API, где отсутствие значения может иметь разные семантические значения.

YupResolver учитывает эти настройки при формировании итогового результата валидации, не создавая ошибок там, где схема явно допускает отсутствие данных.


Перечисления и ограниченные множества

Ограниченные множества значений реализуются через oneOf() и yup.mixed().oneOf([...]).

Особенности:

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

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

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


Взаимодействие типов в составе схем

В реальных схемах базовые типы редко используются изолированно. Чаще формируется комплексная структура, где:

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

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


Поведение типов в контексте YupResolver

При интеграции с YupResolver схема проходит этап интерпретации, на котором:

  • входные значения нормализуются согласно типам Yup
  • выполняется последовательная проверка ограничений
  • формируется объект ошибок с привязкой к путям полей
  • итоговое состояние передаётся в систему управления формой

Тип данных влияет не только на валидацию, но и на то, как результат будет представлен в форме: строка остаётся строкой, число преобразуется, дата становится объектом, массив сохраняет структуру элементов.


Типизация и вывод типов

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

Основные аспекты:

  • автоматическое получение типа через InferType
  • соответствие между схемой и интерфейсом формы
  • предотвращение рассинхронизации данных и валидации

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