Есть место в каждом TypeScript-проекте, где типы перестают защищать — и компилятор при этом не ругается ни разу.

Это граница между модулем и внешним миром. Всё, что приходит из API, JSON или query-параметров, TypeScript принимает на веру: интерфейс описывает форму, но не проверяет сами данные. Поэтому строковый id спокойно уезжает туда, где его ждали числовым, а «потом добавим проверку» так и остаётся комментарием в ревью. Branded types и валидация на входе закрывают эту дыру: ошибка всплывает в момент сборки, а не у пользователя в проде.

Почему границы модулей рушатся первыми и что с этим делать на уровне архитектуры — разбираю дальше в канале.

Больше такого — подписывайся на канал 🔥 TypeScript: границы и архитектура