IT Капибара
Ссылка
нажмите — покажем
нажмите — покажем
🧮 TypeScript типы как язык программирования — погружение в Turing-complete систему типов
Знали ли вы, что TypeScript Turing-полный? Кто-то уже написал на типах Doom, кто-то реализовал арифметические операции. Но зачем? Чтобы лучше писать типы, думая о них как о программах.
🔧 Дженерики = функции
Типы с параметрами работают как функции — принимают входные типы, возвращают выходные:
// Функция
const identity = (value) => value;
// Тип-функция
type Identity<Type> = Type;
// Более сложный пример
type Crud<Resource extends { id: string | number }> = {
create: (resource: Omit<Resource, 'id'>) => Resource;
getOne: (id: Resource['id']) => Resource | undefined;
update: (id: Resource['id'], data: Partial<Omit<Resource, 'id'>>) => Resource;
}
⚡ Условные типы = if/else
Через extends и тернарный оператор получаем полноценные условия:
type IsNumber<Value> = Value extends number ? true : false;
type InferEventType<T extends Event> =
T extends CreateEvent ? "create" :
T extends UpdateEvent ? "update" :
T extends DeleteEvent ? "delete" : never;
📦 infer = переменные
Ключевое слово infer позволяет «вытаскивать» части типов:
type First<T> = T extends [infer Head, ...any[]] ? Head : never;
type Result = First<[string, number, boolean]>; // string
Зачем это нужно? Система типов становится мета-языком для описания структуры данных. Вместо дублирования кода вы описываете логику один раз в типах — и TypeScript автоматически выводит все остальное.
Следующий уровень после изучения базовых дженериков — начинать думать типами как алгоритмами.
🔗 Полная статья
4 · 155 ·