Система типов TypeScript
TypeScript не меняет то, как выполняется код: весь его смысл — в слое типов, который проверяется на этапе компиляции и стирается перед выпуском JavaScript. Знать этот слой — значит уметь описать значение точнее, чем «объект» или «число», и заставить компилятор ловить целые классы ошибок до запуска.
В основе лежат семь примитивов, поверх которых надстроены коллекции (массивы и кортежи), именованные константы (enum) и три особых типа — any, unknown, never, — которые управляют самой строгостью проверки. Почти каждая ошибка новичка здесь — это спутанные роли этих кирпичей: number принимают за int, any за «безопасный», enum за «бесплатную» аннотацию. Полная карта — в слоях ниже.
Карта темы
- Примитивные типы — семь атомов:
string,number,boolean,null,undefined,symbol,bigint; одинnumberи на целые, и на дробные. - any, unknown, never —
anyвыключает проверку,unknown— безопасный верхний тип,never— пустой тип без значений. - Кортежи — массив фиксированной длины с типом на каждой позиции; чем он отличается от обычного массива.
- Перечисления enum — именованные константы, числовые против строковых, runtime-стоимость и
const enum.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Искать отдельные int и float | В TypeScript один number (IEEE-754 double) покрывает и целые, и дробные |
Тянуться к any ради «тишины компилятора» | any отключает проверку в обе стороны — безопасность теряется молча; безопаснее unknown |
Использовать unknown без сужения | Доступ к членам запрещён, пока значение не сужено type guard'ом |
| Путать кортеж с массивом | У кортежа фиксированная длина и тип на каждой позиции; у number[] — нет |
Считать, что числовой enum начинается с 1 | Первый член по умолчанию 0 |
Забыть про runtime-объект enum | Числовой enum генерирует реальный JS-объект; const enum вместо этого встраивается |
Значение для собеседований
Базовые типы спрашивают почти на любом junior/middle интервью по TypeScript — но проверяют не список ключевых слов, а понимание ролей. Кандидат, который объясняет number как «единый IEEE-754 double и для целых, и для дробных», а unknown как «безопасную замену any, требующую сужения», сразу выделяется на фоне «ну, это типы для переменных».
Что обычно проверяют:
- Полный список примитивов и то, что
numberне делится наint/float. - Разницу
any(проверка выключена) иunknown(проверка сохранена, но нужно сужение), рольnever. - Чем кортеж отличается от массива и зачем нужна фиксированная форма.
- Числовые против строковых
enum: обратное отображение, runtime-объект, ценаconst enum.
Типичный неверный ответ: «any и unknown — это одно и то же». Это открывает разговор о том, что unknown сохраняет безопасность (требует type guard перед использованием), а any полностью выключает проверку в обе стороны — и почему unknown почти всегда предпочтительнее.