Skip to content

requiredIf ​

Поле обязательно, если выполняется условие, иначе — необязательное. Аналог required_if в Laravel.

Сигнатура ​

ts
function requiredIf<T>(condition: Condition, schema: Schema<T>): Schema<T | undefined>

type Condition = Record<string, unknown> | ((info: { parent: unknown; root: unknown }) => boolean)

Параметры ​

ПараметрТипОписание
conditionConditionСоседние поля и их значения: { delivery: 'courier' }; несколько значений — массивом: { delivery: ['courier', 'post'] }. Или функция
schemaSchema<T>Схема значения, когда оно передано

Коды ошибок ​

КодКогдаСообщение по умолчанию
requiredЗначение пустое, а поле обязательноRequired

Тексты можно поменять: см. Сообщения и локализация.

Особенности ​

  • Поля условия ищутся в том же объекте, что и само поле. Вложенные — через точку: { 'company.type': 'org' }. Для доступа ко всем данным используйте функцию — она получает { parent, root }.
  • Когда поле не обязательно, оно работает как optional: пустое значение не попадает в data, а переданное — проверяется схемой.
  • В типе TypeScript поле становится необязательным (?).

Примеры ​

Адрес нужен только для доставки ​

ts
const Order = object({
  delivery: oneOf(['pickup', 'courier', 'post']),
  address: requiredIf({ delivery: ['courier', 'post'] }, pipe(string(), minLength(5))),
});

validate(Order, { delivery: 'courier' }).errors; // { address: 'Required' }
validate(Order, { delivery: 'pickup' }).data;    // { delivery: 'pickup' }

Условие-функция ​

ts
const Company = object({
  type: oneOf(['person', 'org']),
  kpp: requiredIf(({ parent }) => parent.type === 'org', string()),
});

См. также ​