В библиотеке валидации Yup метод ensure() используется
для нормализации входных данных, приводя undefined и
null к безопасным значениям, соответствующим типу схемы.
Его основная цель — устранение необходимости вручную проверять наличие
значения перед дальнейшей обработкой.
Для разных примитивных типов применяется собственная логика приведения:
Строки
Yup.string().ensure()
undefined → '' (пустая строка)null → ''Числа
Yup.number().ensure()
undefined → 0null → 0NaN → 0Массивы
Yup.array().ensure()
undefined → []null → []Таким образом, ensure() выступает как механизм дефолтной
нормализации, устраняя “пустые” значения на уровне схемы.
Механизм ensure() работает до выполнения большинства
валидаторов и трансформаций, что делает его важной частью конвейера
обработки данных.
Внутренне схема проходит несколько этапов:
ensure() (если задан)transform()test() и валидаторовdefault() (в зависимости от цепочки)Такое поведение важно учитывать при построении сложных схем, особенно при работе с массивами и объектами.
Сортировка не является встроенной функцией библиотеки, однако
реализуется через механизм transform() внутри массивов.
Yup.array().transform((value, originalValue) => {
if (!Array.isArray(value)) return value;
return [...value].sort((a, b) => a - b);
});
Для числовых массивов:
const schema = Yup.array()
.of(Yup.number())
.transform((value) => {
if (!Array.isArray(value)) return value;
return value.slice().sort((a, b) => a - b);
});
Для строковых массивов:
const schema = Yup.array()
.of(Yup.string())
.transform((value) => {
if (!Array.isArray(value)) return value;
return value.slice().sort((a, b) => a.localeCompare(b));
});
При работе с массивами объектов сортировка требует явного указания ключа:
const schema = Yup.array()
.of(
Yup.object({
name: Yup.string(),
age: Yup.number(),
})
)
.transform((value) => {
if (!Array.isArray(value)) return value;
return value.slice().sort((a, b) => a.age - b.age);
});
Сортировка может выполняться по нескольким полям:
return value.slice().sort((a, b) => {
if (a.age === b.age) {
return a.name.localeCompare(b.name);
}
return a.age - b.age;
});
Комбинация ensure() и сортировки особенно полезна при
обработке входных данных из форм или API, где возможны null
и отсутствующие значения.
const schema = Yup.array()
.ensure()
.of(Yup.number())
.transform((value) => {
return value.slice().sort((a, b) => a - b);
});
В этом случае:
Важно учитывать, что ensure() выполняется до
transform().
Это означает:
Пример цепочки:
Yup.array()
.ensure()
.transform((value) => value.sort());
Если же transform возвращает null или
другой тип, ensure() уже не повторяется, поэтому порядок
влияет на итоговую структуру.
Сортировка внутри transform() не влияет на валидаторы
test() в прямом смысле, но может менять результат
проверки.
Пример:
Yup.array()
.of(Yup.number().min(10))
.transform((value) => value.sort((a, b) => a - b));
Если в массиве есть значения ниже 10, сортировка не устраняет ошибку, но может повлиять на порядок выявления нарушений при кастомных проверках.
const schema = Yup.object({
tags: Yup.array()
.ensure()
.of(Yup.string())
.transform((value) => value.sort()),
});
Вход:
{ tags: undefined }
Результат:
{ tags: [] }
const schema = Yup.array()
.ensure()
.of(
Yup.object({
id: Yup.number(),
priority: Yup.number(),
})
)
.transform((value) =>
value.sort((a, b) => b.priority - a.priority)
);
ensure() не является валидатором в классическом смысле,
а относится к механизмам нормализации. Его ключевые особенности:
required()default(), но не
заменяет егоПри комбинировании с трансформациями следует учитывать:
ensure() не предотвращает появление NaN в
сложных вычисленияхtransform() всегда должна учитывать
неизменяемость массиваtransform() может приводить к
перезаписи результата предыдущих трансформацийПример безопасного подхода:
Yup.array()
.ensure()
.of(Yup.number())
.transform((value) => {
if (!Array.isArray(value)) return value;
return [...value].sort((a, b) => a - b);
});
Для вложенных массивов ensure применяется только на уровне текущей схемы:
Yup.object({
matrix: Yup.array().of(
Yup.array().ensure().of(Yup.number())
),
});
В данном случае каждый вложенный массив нормализуется отдельно, но сортировка должна быть реализована на соответствующем уровне вложенности.