Skip to content

variant ​

Несколько вариантов объекта, вариант выбирается по полю-признаку (например, type). В отличие от union, показывает ошибки именно выбранного варианта.

Сигнатура ​

ts
function variant<K extends string, const T extends readonly ObjectSchema[]>(key: K, options: T, msg?: Message): Schema<Infer<T[number]>>

Параметры ​

ПараметрТипОписание
keystringИмя поля-признака
optionsObjectSchema[]Схемы object. У каждой должно быть поле key — обычно literal
msgMessageСвоё сообщение для пустого значения, не объекта и неизвестного варианта

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

  • Признак проверяется схемой поля 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

См. также ​

  • union — «или» для любых схем
  • literal — значение признака
  • object