Объектная модель данных в Yup строится вокруг схемы
object(), которая описывает структуру, вложенность и
правила валидации для сложных сущностей. При использовании YupResolver в
связке с формами (например, React Hook Form) именно объектные схемы
становятся центральным элементом описания формы, так как позволяют
декларативно задавать правила проверки для каждого поля и уровня
вложенности.
Схема объекта в Yup создаётся через Yup.object() и
принимает в качестве аргумента описание полей через
shape.
import * as Yup from "yup";
const schema = Yup.object({
name: Yup.string().required("Имя обязательно"),
age: Yup.number().required("Возраст обязателен").min(0),
});
Конструкция shape может быть использована явно:
const schema = Yup.object().shape({
name: Yup.string().required(),
age: Yup.number().required(),
});
Обе формы эквивалентны, но shape чаще используется для
повышения читаемости в сложных схемах.
Yup выполняет валидацию по ключам объекта. Каждый ключ сопоставляется с отдельной схемой, а итоговый результат агрегируется в единый объект ошибок.
При использовании YupResolver этот процесс становится промежуточным слоем между формой и схемой:
По умолчанию поля в объекте считаются необязательными, если явно не указано обратное.
const schema = Yup.object({
email: Yup.string().required("Email обязателен"),
phone: Yup.string(), // необязательное поле
});
Важно учитывать, что отсутствие required() означает
допустимость undefined, но не всегда null.
Поведение можно уточнять через дополнительные методы:
Yup.string().nullable().required()
Одно из ключевых преимуществ Yup — поддержка глубоко вложенных структур.
const schema = Yup.object({
user: Yup.object({
name: Yup.string().required(),
address: Yup.object({
city: Yup.string().required(),
zip: Yup.string().required(),
}),
}),
});
В контексте YupResolver такие структуры автоматически преобразуются в плоские ошибки с использованием точечной нотации:
user.nameuser.address.cityЭто позволяет напрямую связывать ошибки с полями формы.
Если вложенный объект не передан, Yup может вести себя по-разному в зависимости от конфигурации:
const schema = Yup.object({
profile: Yup.object({
bio: Yup.string(),
}).required("Профиль обязателен"),
});
При отсутствии profile вся ветка считается
невалидной.
Для более гибкого поведения используется default:
profile: Yup.object({
bio: Yup.string(),
}).default({})
При работе с объектами важно контролировать лишние поля. Yup
поддерживает опцию stripUnknown, которая удаляет все
свойства, не описанные в схеме.
const schema = Yup.object({
name: Yup.string().required(),
}).noUnknown(true);
Поведение:
{ name: "A", age: 20 }{ name: "A" }В связке с YupResolver это особенно важно для защиты от «грязных» данных из формы.
Метод transform позволяет изменять входной объект перед
валидацией.
const schema = Yup.object({
settings: Yup.object({
theme: Yup.string(),
}).transform((value) => value ?? { theme: "light" }),
});
Это используется для нормализации структуры данных до применения правил проверки.
Часто объекты содержат массивы, и Yup корректно поддерживает такие структуры.
const schema = Yup.object({
users: Yup.array().of(
Yup.object({
name: Yup.string().required(),
role: Yup.string().required(),
})
),
});
YupResolver в этом случае формирует ошибки вида:
users[0].nameusers[1].roleYupResolver выступает адаптером между Yup и системой форм. При передаче объектной схемы он выполняет следующие шаги:
schema.validate()Пример использования:
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
const schema = Yup.object({
user: Yup.object({
name: Yup.string().required(),
}),
});
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: yupResolver(schema),
});
Ошибки в объектных схемах всегда структурированы. Это важно для корректного отображения UI:
errors.user?.name?.message
Особенности:
Yup позволяет извлекать типы из объектных схем:
import * as Yup from "yup";
const schema = Yup.object({
name: Yup.string().required(),
age: Yup.number().required(),
});
type FormData = Yup.InferType<typeof schema>;
Это обеспечивает согласованность между схемой и типами данных формы.
Для случаев редактирования данных часто требуется частичная валидация:
Yup.object({
name: Yup.string(),
profile: Yup.object({
bio: Yup.string(),
}),
}).partial();
Метод partial() делает все поля необязательными, включая
вложенные объекты.
Объекты часто содержат зависимости между полями:
const schema = Yup.object({
isCompany: Yup.boolean(),
companyName: Yup.string().when("isCompany", {
is: true,
then: (schema) => schema.required(),
}),
});
В объектной структуре такие условия работают на любом уровне вложенности.
При использовании YupResolver с объектами часто возникают типовые ошибки:
defaultValues и схемыundefined вместо
{}Корректная инициализация предотвращает большинство проблем:
const defaultValues = {
user: {
name: "",
},
};
Yup различает null и undefined:
undefined — отсутствие значенияnull — явное пустое значениеКонтроль осуществляется через:
Yup.object().nullable().default(null)
При сложных объектах с глубокой вложенностью важно учитывать:
Оптимизация достигается через:
when вместо дублирующих схем