Skip to content

brand ​

Тип с «меткой». Строки UserId и OrderId выглядят одинаково, но TypeScript не даст передать одно вместо другого.

Сигнатура ​

ts
function brand<T, B extends string>(schema: Schema<T>, name: B): Schema<T & Brand<B>>

Параметры ​

ПараметрТипОписание
schemaSchema<T>Схема значения, когда оно передано
namestringИмя метки

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

Метка есть только в типах — во время работы значение не меняется. Получить значение с меткой можно только через проверку схемой: это гарантирует, что каждый UserId в коде когда-то прошёл проверку.

Пример ​

ts
const UserId = brand(pipe(string(), uuid()), 'UserId');
const OrderId = brand(pipe(string(), uuid()), 'OrderId');
type UserId = Infer<typeof UserId>;
type OrderId = Infer<typeof OrderId>;

function getUser(id: UserId) { /* … */ }

const orderId = parse(OrderId, req.params.id);
getUser(orderId);                 // TypeScript error
getUser('550e8400-…');            // TypeScript error too
getUser(parse(UserId, req.params.id)); // ok

См. также ​