Skip to content

union ​

Первая подходящая схема из списка — «или»: значение может быть числом или строкой, 'auto' или числом и т.п.

Сигнатура ​

ts
function union<const T extends readonly Schema[]>(options: T, msg?: Message): Schema<Infer<T[number]>>

Параметры ​

ПараметрТипОписание
optionsSchema[]Схемы, которые проверяются по порядку
msgMessageСвоё сообщение, если не подошла ни одна схема

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

  • Схемы проверяются по порядку, возвращается результат первой подошедшей — вместе с её преобразованиями.
  • Если не подошла ни одна — одна ошибка union, без подробностей по каждой схеме. Для объектов с полем-признаком (type) используйте variant: он покажет ошибки конкретного варианта.
  • Пустое значение даёт required, если среди схем нет optional.
  • Тип результата — объединение типов схем: union([number(), literal('auto')]) → number | 'auto'.

Коды ошибок ​

КодКогдаСообщение по умолчанию
requiredЗначение пустоеRequired
unionНе подошла ни одна схемаDoes not match any allowed type

Примеры ​

ID — число или slug ​

ts
const id = union([pipe(coerce.number(), integer()), pipe(string(), pattern(/^[a-z0-9-]+$/))]);

validate(id, '42').data;        // 42
validate(id, 'my-post').data;   // 'my-post'
validate(id, 'My Post').errors; // { '': 'Does not match any allowed type' }

«auto» или число ​

ts
const width = union([literal('auto'), pipe(number(), min(0))]); // 'auto' | number

См. также ​

  • variant — объекты с полем-признаком, понятные ошибки
  • oneOf — одно из конкретных значений