variant
Несколько вариантов объекта, вариант выбирается по полю-признаку (например, type). В отличие от union, показывает ошибки именно выбранного варианта.
Сигнатура
ts
function variant<K extends string, const T extends readonly ObjectSchema[]>(key: K, options: T, msg?: Message): Schema<Infer<T[number]>>Параметры
| Параметр | Тип | Описание |
|---|---|---|
key | string | Имя поля-признака |
options | ObjectSchema[] | Схемы object. У каждой должно быть поле key — обычно literal |
msg | Message | Своё сообщение для пустого значения, не объекта и неизвестного варианта |
Особенности
- Признак проверяется схемой поля
keyкаждого варианта по порядку; дальше объект проверяется подошедшим вариантом целиком. - Признак может быть
literal,oneOfилиenumOf— их значения попадают в сообщение об ошибке. - Ошибка неизвестного варианта привязана к полю-признаку:
errors.type. - Тип результата — размеченное объединение: после
if (data.type === 'card')TypeScript знает поля этого варианта.
Коды ошибок
| Код | Когда | Сообщение по умолчанию |
|---|---|---|
required | Значение или признак пустые | Required |
object | Не объект | Must be an object |
variant | Неизвестное значение признака | Unknown type, expected one of: {options} |
Пример
Способ оплаты
ts
const Payment = variant('type', [
object({ type: literal('card'), number: pipe(string(), length(16)) }),
object({ type: literal('invoice'), inn: pipe(string(), length(10)) }),
]);
validate(Payment, { type: 'card' }).errors; // { number: 'Required' }
validate(Payment, { type: 'cash' }).errors; // { type: 'Unknown type, expected one of: card, invoice' }
const payment = parse(Payment, body);
if (payment.type === 'card') payment.number; // string