TypeScript
Для чего модуль
Использовать TypeScript как инженерный инструмент качества: уменьшать классы ошибок, ускорять рефакторинг и делать контракты системы прозрачными.
Результат после прохождения
- Вы строите доменные типы, а не «просто аннотации для компилятора».
- Вы уверенно применяете narrowing, discriminated unions и generics.
- Вы типизируете границы системы (UI/API/domain) с учетом runtime-валидации.
- Вы управляете строгими настройками TS в больших проектах без «type debt».
Термины и аббревиатуры
| Термин | Коротко |
|---|---|
Union | Тип из нескольких вариантов |
Narrowing | Уточнение типа проверками |
Generic | Тип-параметр |
DTO | Контракт данных на границе |
unknown | Безопасный неизвестный тип |
Фокус по грейдам
Junior: понимать базовые механики и объяснять их простыми примерами.Middle: п рименять тему в продуктовых сценариях с учетом рисков и ограничений.Senior: управлять архитектурными trade-offs, метриками и эволюцией решения.
Как работать с модулем
- Все примеры прогоняйте в
strict-режиме. - На каждый урок делайте мини-рефакторинг существующего кода.
- Для каждой типовой конструкции фиксируйте: какой класс ошибок она предотвращает и какой ценой.
Программа модуля
Урок 1. Базовая тип-модель
Цель: описывать доменную модель так, чтобы типы отражали реальные состояния системы.
Union, intersection, literal types
- Union описывает варианты состояния.
- Intersection собирает составные контракты.
- Literal types фиксируют допустимые значения.
Discriminated unions и exhaustiveness
type LoadState<T> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'success'; data: T }
| { status: 'error'; error: string };
function renderState(s: LoadState<string[]>) {
switch (s.status) {
case 'idle':
case 'loading':
case 'success':
case 'error':
return s.status;
default: {
const _exhaustive: never = s;
return _exhaustive;
}
}
}
Где ломается в проде
- Моделируют «частично известный объект» через
any. - Не описывают переходы состояния и получают impossible states.
- Выключают строгие проверки ради скорости.
Мини-задача (обязательная)
Смоделируйте состояние async-флоу через discriminated union, добавьте exhaustiveness check и покажите, какую ошибку это предотвращает.
Что спросит интервьюер:
как never помогает ловить ошибки в switch.
Критерий готовности по уроку: вы можете выразить типами все допустимые состояния фичи и исключить невозможные комбинации.
Урок 2. Generics и переиспользование
Цель: писать переиспользуемые типобезопасные API без перегрузки сложностью.