union
Первая подходящая схема из списка — «или»: значение может быть числом или строкой, 'auto' или числом и т.п.
Сигнатура
ts
function union<const T extends readonly Schema[]>(options: T, msg?: Message): Schema<Infer<T[number]>>Параметры
| Параметр | Тип | Описание |
|---|---|---|
options | Schema[] | Схемы, которые проверяются по порядку |
msg | Message | Своё сообщение, если не подошла ни одна схема |
Особенности
- Схемы проверяются по порядку, возвращается результат первой подошедшей — вместе с её преобразованиями.
- Если не подошла ни одна — одна ошибка
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