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)Параметры
| Параметр | Тип | Описание |
|---|---|---|
condition | Condition | Соседние поля и их значения: { delivery: 'courier' }; несколько значений — массивом: { delivery: ['courier', 'post'] }. Или функция |
schema | Schema<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()),
});