В библиотеке Yup функции валидации являются центральным механизмом, через который определяется логика проверки данных. Они используются в кастомных проверках, трансформациях и расширениях схем. Понимание структуры параметров таких функций позволяет точно контролировать процесс валидации и использовать весь потенциал библиотеки.
При использовании метода test у любого типа схемы Yup
передаётся функция следующего вида:
(value, context) => boolean | ValidationError | undefined
Где:
Параметр value всегда содержит «сырое» значение поля
после применения трансформаций (transform), но до
финального результата валидации.
Особенности:
undefined, если поле отсутствуетnull, если это допустимое состояние
схемыВторой параметр функции проверки предоставляет расширенную информацию о текущем состоянии схемы:
(value, context) => {}
Контекст включает следующие ключевые поля:
Строка, указывающая путь к проверяемому полю.
Пример:
"user.email"
Используется для формирования ошибок и диагностики.
Объект родительского уровня, содержащий все поля текущего объекта.
Пример:
{
email: "test@mail.com",
password: "123456"
}
Позволяет реализовывать межполевую валидацию.
Исходное значение до применения transform.
Используется для случаев, когда важно сохранить оригинальный ввод пользователя.
Ссылка на текущую схему Yup.
Позволяет выполнять повторные проверки или доступ к внутренним методам.
Объект настроек, переданных в validate.
Наиболее часто используемые параметры:
Функция для явного формирования ошибки валидации.
Сигнатура:
createError({ message, path })
Используется вместо возврата false, когда требуется
детализированная ошибка.
Помимо явного context, Yup также привязывает служебные
данные к this:
this.path
this.parent
this.schema
this.options
this.createError
this.originalValue
Это важно учитывать, поскольку многие старые и новые примеры
используют именно this.
Пример:
Yup.string().test('check-name', function (value) {
if (!value) {
return this.createError({ message: 'Значение обязательно' });
}
return true;
});
Функция может возвращать:
Проверка успешно пройдена.
Стандартная ошибка с использованием сообщения по умолчанию.
Позволяет сформировать кастомную ошибку.
Рассматривается как успешная проверка (используется редко).
Отдельный набор параметров передаётся при вызове:
schema.validate(value, options)
Тип: boolean
true — остановка при первой ошибкеfalse — сбор всех ошибокТип: boolean
Тип: boolean
Тип: object
Передаёт пользовательские данные в функции проверки:
schema.validate(data, { context: { role: 'admin' } })
Доступ внутри test:
this.options.context
Комбинация параметров позволяет реализовывать сложные сценарии:
Yup.number().test('min-role-based', function (value) {
const role = this.options.context?.role;
if (role === 'admin' && value < 10) {
return this.createError({
message: 'Для администратора минимум 10'
});
}
return true;
});
Сигнатура метода test может выглядеть так:
test(name, message, testFunction)
где testFunction получает:
Пример:
Yup.string().test(
'len-check',
'Слишком короткое значение',
function (value, context) {
if (value && value.length < 3) {
return context.createError();
}
return true;
}
);
При конфликте значений:
this имеет приоритет над вторым аргументомoptions.context переопределяет глобальные значенияoriginalValue не изменяется трансформациямиФункция может возвращать Promise:
test('async-check', async function (value) {
const isValid = await apiCheck(value);
if (!isValid) {
return this.createError({ message: 'Ошибка сервера' });
}
return true;
});
Контекст сохраняется и в асинхронном режиме, включая
path, parent и options.
Используется parent:
Yup.object({
password: Yup.string(),
confirm: Yup.string().test(function (value) {
return value === this.parent.password;
})
});
Используется options.context:
test(function (value) {
const mode = this.options.context?.mode;
return mode === 'strict' ? value !== '' : true;
});
Используется createError:
test(function (value) {
if (!value) {
return this.createError({
path: this.path,
message: 'Поле не заполнено'
});
}
return true;
});
Функция проверки в Yup фактически опирается на три источника данных:
Эта трёхуровневая модель обеспечивает гибкость при построении как простых, так и сложных валидаторов, включая асинхронные сценарии, межполевые зависимости и динамическую логику на основе внешнего контекста.