undefined и nullВалидационная модель Yup строится вокруг строгого различения трёх состояний значения:
undefined — значение отсутствуетnull — значение явно задано как пустоеЭти состояния по умолчанию обрабатываются по-разному, и это напрямую влияет на результат валидации.
undefined в большинстве схем трактуется как отсутствие
значения и часто активирует правила required(), если они
заданы.
null рассматривается как явное значение и не
эквивалентен отсутствию данных. Это ключевой момент, который влияет на
поведение схем.
undefined
валидацииЗначение undefined в Yup почти всегда интерпретируется
как «поле не заполнено».
Пример базового поведения:
import * as Yup from "yup";
const schema = Yup.string().required();
schema.validate(undefined);
Результат: ошибка валидации, так как required() требует
наличия значения.
undefined считается отсутствием значенияrequired() при его наличииdefault()nullnull в Yup является отдельным допустимым значением,
которое не всегда считается отсутствием данных.
const schema = Yup.string().required();
schema.validate(null);
Результат: валидация может пройти или упасть в зависимости от конфигурации схемы.
nullable() null часто вызывает
ошибкуnullable(true) null становится
допустимым значениемnullable()Метод nullable() управляет допустимостью
null:
const schema = Yup.string().nullable();
schema.validate(null);
Теперь null считается валидным значением.
undefinedrequired()null допустимым значением на уровне типаКомбинация:
Yup.string().nullable().required();
означает: null допустим, но пустое значение (включая
undefined) недопустимо.
defined()defined() в Yup используется для запрета
undefined.
const schema = Yup.string().defined();
undefined → ошибкаnull → допускается (если не запрещён отдельно)required() и
defined()Эти методы часто путаются, но их семантика различна:
required()undefined, null, пустые
строки (в зависимости от типа)defined()undefinedБез дополнительных модификаторов поведение схемы в Yup можно описать так:
undefined → считается отсутствующим значениемnull → может считаться невалидным (зависит от
типа)default()Метод default() позволяет заменять
undefined:
const schema = Yup.string().default("значение по умолчанию");
schema.cast(undefined);
Результат: "значение по умолчанию"
cast()nulltransform() и
нормализация null / undefinedМетод transform() позволяет централизованно управлять
поведением значений:
const schema = Yup.string().transform((value, originalValue) => {
if (originalValue === null) return "";
return value;
});
null в пустую строкуundefined на дефолтные значенияРазные типы в Yup по-разному реагируют на null и
undefined:
undefined → отсутствие значенияnull → требует nullable()null обычно невалиден без nullable()undefined может активировать
required()undefined → ошибка при required()null часто требует явного разрешенияВ реальных схемах часто встречаются комбинации:
const schema = Yup.object({
name: Yup.string().nullable().defined(),
});
Поведение:
undefined запрещёнnull разрешёнПри интеграции с API часто возникает различие:
undefinednull передаётся явноЭто приводит к тому, что:
undefined появляется только на уровне приложенияnull приходит с сервера как осознанное значениеВ Yup это различие критично при валидации входных DTO.
stripUnknownПри использовании:
Yup.object().noUnknown()
или аналогичных конфигураций:
undefined может быть удалён до валидацииnull сохраняется как значениеПоведение можно обобщить:
undefined — отсутствие данных на уровне структурыnull — намеренно пустое значениеYup требует явного указания, как трактовать оба
состоянияundefined и nullnull и undefinedВ Yup это разные состояния и не взаимозаменяемы.
required() вместо defined()required() не всегда покрывает сценарии строгой проверки
структуры.
nullable()Приводит к неожиданным ошибкам при передаче null из
API.
При проектировании схем в Yup обычно применяются следующие подходы:
nullable() для API-данных с явными пустыми
значениямиdefined() для строгих структурdefault() для нормализации отсутствующих
значенийundefined в
бизнес-логикеПорядок вызова методов влияет на итоговую логику:
Yup.string().required().nullable();
и
Yup.string().nullable().required();
могут вести себя по-разному в зависимости от версии и контекста, так
как обработка null и required() выполняется на
разных этапах валидационного пайплайна.