Основы Typescript
2026-02-26 22:26 Diff

В этом уроке мы познакомимся с сужением типов.

Использование сужения типа

В JavaScript часто встречается код, в котором в одних и тех же переменных могут быть значения разных типов. Они обрабатываются на основе логических проверок с помощью typeof и других подобных механизмов.

Ниже пример реализации функции, которая конвертирует любое переданное значение в boolean:

В этом коде параметр имеет тип unknown. Внутри TypeScript позволяет выполнять с этим параметром разные действия. Они будут зависеть от заданных условий.

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

Поскольку подобный код в JavaScript встречается часто, систему типов TypeScript пришлось доработать так, чтобы осталась возможность писать подобный код.

В данном случае оказывается, что TypeScript умеет выполнять часть условных конструкций статически, как проверку совместимости типов, без запуска кода. Затем внутри блока с условием компилятор считает, что тип значения совпадает с тем, что было в самой проверке. Этот процесс в TypeScript называется Type Narrowing — сужение типа.

Сужение типа работает не только для типа unknown. Это универсальный механизм, который работает со всеми возможными типами, например, Union Types:

Также switch поддерживает сужение типа:

Внутри каждого блока case тип значения сужается до того, что было в самом case. Перегрузка функций в TypeScript — это тоже пример работы сужения типов:

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