Yup версии 1.x принесла ряд изменений, которые затронули как внутреннюю архитектуру, так и публичный API. Переход с 0.x требует внимательного пересмотра схем валидации, обработки ошибок и типизации, поскольку часть привычных методов была изменена или переосмыслена.
В версии 0.x схемы часто строились вокруг цепочек методов, которые могли комбинироваться без строгого контроля контекста. В 1.x акцент смещён в сторону более явной и предсказуемой декларативности.
Одним из ключевых изменений стало усиление роли базовых схем:
string(), number(), boolean()
стали более строгими в обработке входных значенийtransformПример различий:
// 0.x (поведение более "гибкое")
Yup.string().required().email()
// 1.x (поведение более строгое и предсказуемое)
Yup.string()
.strict(true)
.required()
.email()
Работа с object() стала более детализированной. В 0.x
часто допускалась частичная валидация без строгого контроля вложенных
схем. В 1.x поведение изменилось в сторону полной иерархической
проверки.
const schema = Yup.object({
user: Yup.object({
name: Yup.string().required(),
age: Yup.number().min(18)
})
});
В 1.x важно учитывать, что:
undefined больше не игнорируется по умолчанию в
некоторых контекстахdefault() значениямиОдно из заметных изменений — пересмотр логики nullable()
и defined().
В 0.x null часто проходил через валидацию без
дополнительных условий. В 1.x это поведение стало более
контролируемым.
Yup.string()
.nullable()
.defined()
Теперь:
nullable() разрешает null, но не
undefineddefined() запрещает оба варианта отсутствия
значенияМетод transform стал более предсказуемым и получил
улучшенный контроль порядка выполнения.
Yup.number().transform((value, originalValue) => {
return originalValue === "" ? null : value;
});
В версии 1.x важно учитывать:
array() получил более строгую модель проверки
элементов.
Yup.array()
.of(Yup.number().required())
.min(1)
Ключевые отличия от 0.x:
compact() и фильтрации стало менее
неявнымВ 1.x переработан формат ошибок валидации:
path)try {
await schema.validate(data, { abortEarly: false });
} catch (err) {
console.log(err.inner);
}
Особенности:
abortEarly: false теперь является более важным при
сложных формахinner всегда содержит полный список
ошибокПоведение синхронной и асинхронной валидации стало более согласованным.
schema.isValid(data).then(valid => {});
schema.validateSync(data);
В 1.x:
Поддержка TypeScript стала более глубокой:
InferType стал точнее отражать итоговую структуруany в сложных
объектахimport * as Yup from "yup";
const schema = Yup.object({
name: Yup.string().required(),
age: Yup.number().required()
});
type User = Yup.InferType<typeof schema>;
Особенности:
required()nullable() влияет на итоговый union-типМетод test получил более предсказуемую модель
выполнения:
Yup.string().test(
"custom-check",
"Ошибка проверки",
(value) => value?.startsWith("A")
);
В 1.x:
this стал менее рекомендованнымYup.string().test(
"async-check",
async (value) => {
return await checkFromServer(value);
}
);
when() стал более строгим и явным в зависимости от
зависимостей.
Yup.string().when("isActive", {
is: true,
then: (schema) => schema.required(),
otherwise: (schema) => schema.notRequired()
});
Особенности 1.x:
При переходе с 0.x на 1.x наиболее критичны следующие моменты:
undefined и null требует явного
определенияОсобое внимание требуется уделить: