Валидация объектов в Yup строится вокруг метода
yup.object(), который позволяет описывать структуру сложных
данных, состоящих из вложенных полей. Объектная схема представляет собой
контейнер для набора валидаторов, каждый из которых применяется к
конкретному ключу объекта.
Основная идея заключается в том, что каждый уровень вложенности описывается отдельной схемой, что делает возможной строгую типизацию и проверку сложных структур данных.
Объектная схема создаётся через yup.object() без
параметров или с передачей структуры через shape().
import * as yup from 'yup';
const schema = yup.object({
name: yup.string().required(),
age: yup.number().min(18),
});
Альтернативный вариант с явным указанием структуры:
const schema = yup.object().shape({
name: yup.string().required(),
age: yup.number().min(18),
});
Оба варианта эквивалентны, однако использование shape()
чаще применяется при динамическом построении схем.
Объектные схемы поддерживают рекурсивное описание вложенных структур.
Каждый вложенный объект также является отдельной схемой
yup.object().
const schema = yup.object({
user: yup.object({
id: yup.number().required(),
profile: yup.object({
email: yup.string().email().required(),
phone: yup.string(),
}),
}),
});
Валидация выполняется по всей глубине структуры, включая все вложенные уровни.
По умолчанию поля считаются необязательными, если не указано иное.
Для строгой проверки используется required().
const schema = yup.object({
username: yup.string().required(),
nickname: yup.string(), // необязательное поле
});
Объект целиком может быть отмечен как обязательный:
const schema = yup.object().required();
Метод noUnknown() позволяет запретить наличие полей, не
описанных в схеме.
const schema = yup.object({
name: yup.string(),
}).noUnknown();
При передаче дополнительных ключей объект будет считаться невалидным.
Строгий режим strict() отключает автоматические
преобразования значений:
const schema = yup.object({
age: yup.number(),
}).strict();
Объектные схемы могут содержать значения по умолчанию через
default().
const schema = yup.object({
role: yup.string().default('user'),
});
Если поле отсутствует в исходных данных, оно будет заполнено значением по умолчанию при трансформации.
Схемы могут быть расширены через concat(), что позволяет
модульно строить объектные структуры.
const baseSchema = yup.object({
id: yup.number().required(),
});
const extendedSchema = baseSchema.concat(
yup.object({
name: yup.string().required(),
})
);
Это полезно при построении переиспользуемых базовых моделей.
Метод when() позволяет изменять структуру или правила в
зависимости от других полей.
const schema = yup.object({
type: yup.string(),
company: yup.string().when('type', {
is: 'business',
then: (schema) => schema.required(),
otherwise: (schema) => schema.notRequired(),
}),
});
Объектная схема может динамически адаптироваться к входным данным.
Метод test() применяется для создания пользовательских
правил на уровне объекта.
const schema = yup.object({
password: yup.string(),
confirmPassword: yup.string(),
}).test('match', 'Пароли не совпадают', (value) => {
return value?.password === value?.confirmPassword;
});
Функция получает весь объект целиком, что позволяет реализовывать межполевую проверку.
В случаях, когда структура объекта заранее неизвестна, используется свободная схема:
const schema = yup.object().shape({
metadata: yup.object().noUnknown(false),
});
Также возможно использование lazy() для динамического
построения схем:
const schema = yup.object({
config: yup.lazy((value) => {
if (typeof value === 'object') {
return yup.object({
key: yup.string(),
});
}
return yup.mixed();
}),
});
Объектные схемы поддерживают трансформацию входных данных через
transform().
const schema = yup.object({
tags: yup.array().transform((value) =>
typeof value === 'string' ? value.split(',') : value
),
});
Это позволяет нормализовать данные перед валидацией.
Метод pick() позволяет выделить подмножество полей
схемы.
const fullSchema = yup.object({
id: yup.number(),
name: yup.string(),
age: yup.number(),
});
const partialSchema = fullSchema.pick(['id', 'name']);
Метод omit() выполняет обратную операцию:
const schemaWithoutAge = fullSchema.omit(['age']);
Объектные схемы часто комбинируются с массивами для описания коллекций.
const schema = yup.object({
users: yup.array().of(
yup.object({
id: yup.number().required(),
email: yup.string().email(),
})
),
});
Каждый элемент массива проходит отдельную валидацию согласно объектной схеме.
Функция reach() позволяет получить доступ к глубоко
вложенному полю схемы.
const fieldSchema = yup.reach(schema, 'user.profile.email');
Это используется для динамической работы с частями большой схемы.
При необходимости несколько схем могут объединяться в одну структуру
через повторное использование object() и
shape().
const addressSchema = yup.object({
city: yup.string(),
street: yup.string(),
});
const userSchema = yup.object({
name: yup.string(),
address: addressSchema,
});
Такой подход обеспечивает модульность и повторное использование логики валидации.
Если объект не передан полностью, поведение зависит от конфигурации схемы:
required() — объект обязателенrequired() — допускается
undefineddefault() — применяется подстановка значенийconst schema = yup.object({
settings: yup.object().default({
theme: 'dark',
}),
});
При валидации Yup может выполнять преобразование типов, включая:
undefined полейdefault()transform()Строгий режим отключает такие преобразования и фиксирует входные данные в исходном виде.
Объектные схемы являются основой композиции валидации, позволяя строить многоуровневые модели данных с единообразной логикой проверки, где каждый уровень представляет собой независимую, но связуемую единицу схемы.