TGViewer
S0ER S0ER @softwareengineervlog · 10.4K subscribers
Post #1996 9.91K
Брендированные типы в typescript

Привет, с вами снова @devmargooo и сегодня мы с вами поговорим о типизации в приложении на typescript. Структурная типизация в typescript, в отличие от номинативной, определяет совместимость типов, основываясь не на названии типа, а на его наборе полей. В этом структурная типизация похожа на утиную: если это выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка. К сожалению, это может приводить к проблемам. Следующий код не приведет к ошибке компиляции, несмотря на то, что тип some_string указан как string, а не Email :

type Email = string;

function auth(login:Email) {}

const some_string:string = "some_string";

auth(some_string); // ok


Тип string структурно идентичен типу Email , поэтому ошибки нет.

Номинативные типы работают по-другому - они совместимы только при явном использовании. К сожалению, встроенной поддержки таких типов в typescript нет, но есть хак, который называют брендированием. Его суть заключается в том, что мы добавляем к типу уникальное свойство:

type Email = string & { _: 'Email' };


Теперь тип Email будет структурно не совместим с типом string. Мы получим ошибку компиляции:

type Email = string & { _: 'Email' };

function auth(login:Email) {}

const some_string:string = "some_string";

auth(some_string); // Argument of type 'string' is not assignable to parameter of type 'Email'.


Чтобы код заработал, нам придется явно указывать, что переменная имеет тип Email:

const some_string = "some_string" as Email;


Или добавить проверку в наш код, которая также будет выводить нужный нам тип:

function isEmail(value:string): value is Email {
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
return emailRegex.test(value);
}


Для удобства создания брендированных типов можно воспользоваться дежнериком:

type Brand<B extends string, T> = T & { readonly _: B }


Пример использования:
type Email = Brand<'Email', string>;
  • 👍 52
  • 💩 16
  • ❤ 2
  • 🤷 1
More from @softwareengineervlog
  1. Sep 3, 2026Google выпустила Gemini 3.8 Flash — новая быстрая модель уже обходит гигантов в кодинге. П…
  2. Sep 3, 2026Сейчас использую DeesSeek v4 Flash, на готовой кодовой базе решать стандартные таски из тр…
  3. Aug 6, 2026Полезное: разраб сделал интерактивный мануал, который по шагам показывает, что происходит…
  4. Aug 5, 2026Ты ненастоящий программист! Это происходит снова и снова, и каждый раз одинаково. Я начал…
  5. Jul 27, 2026Внимание, скам! Появился бот который выдает себя за бота моего канала. Я НИЧЕГО ЧЕРЕЗ БОТО…
  6. Jul 25, 2026У Сбера есть интересный whitepaper где он описывает технологию разработки продукта с помощ…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →