brand
Тип с «меткой». Строки UserId и OrderId выглядят одинаково, но TypeScript не даст передать одно вместо другого.
Сигнатура
ts
function brand<T, B extends string>(schema: Schema<T>, name: B): Schema<T & Brand<B>>Параметры
| Параметр | Тип | Описание |
|---|---|---|
schema | Schema<T> | Схема значения, когда оно передано |
name | string | Имя метки |
Особенности
Метка есть только в типах — во время работы значение не меняется. Получить значение с меткой можно только через проверку схемой: это гарантирует, что каждый 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