логотип PurpleSchool
Иконка входа
Вход
  • Обучение
  • Войти
логотип PurpleSchool

Условные типы в TypeScript

Автор

Дмитрий Нечаев

Conditional Types (Условные типы) в TypeScript — это особенный синтаксис для работы с типами, позволяющий определять типы данных на основе условий. Эта возможность делает систему типов TypeScript еще более гибкой и мощной, позволяя создавать сложные и выразительные типы, адаптирующиеся к различным ситуациям.

Примером может служить тип T, который будет равен типу X, если условие C истинно, и типу Y, если условие C ложно:

type ConditionalType = C extends X ? Y : Z;

Ограничения условных типов (Conditional Type Constraints)

Ограничения условных типов позволяют уточнить, какие типы могут быть использованы в условиях. Это важно для предотвращения ошибок во время компиляции и упрощения рефакторинга кода. Ограничения могут быть применены для того, чтобы указать, что определённый тип должен соответствовать базовому типу или интерфейсу.

Пример:

type Check<T> = T extends string ? "String" : "Not a string";

В этом примере тип T проверяется, и если T является подтипом string, то Check<T> будет равен "String", иначе — "Not a string".

Предположения в условных типах (Inferring Within Conditional Types)

Типы можно не только проверять, но и извлекать из других типов, используя ключевое слово infer. Это особенно полезно при работе с обобщёнными типами, где вам нужно работать с частями сложных типов.

Пример:

type InferSomething<T> = T extends infer U ? U : never;

Здесь U — это тип, который TypeScript попытается вывести самостоятельно из типа T. Если тип можно вывести, он используется как U, в противном случае результатом будет never.

Распределительные условные типы (Distributive Conditional Types)

Это особенность условных типов в TypeScript, которая позволяет применять условный тип к каждому члену объединения типов. Это автоматически происходит, когда условный тип применяется к типу, который является объединением.

Пример:

type DistributiveCheck<T> = T extends any ? T : never;
type Result = DistributiveCheck<string | number | boolean>;  // Результат: string | number | boolean

В этом примере DistributiveCheck применяется к каждому элементу объединения (string, number, boolean), возвращая тот же тип.

заключение

Условные типы в TypeScript предоставляют мощный инструмент для создания гибких и выразительных типов, способных адаптироваться к различным ситуациям в коде. Они могут быть особенно полезны для библиотек, API и фреймворков, где требуется учитывать множество различных сценариев использования типов. Возможности, такие как ограничения, вывод типов и распределение, только усиливают эту гибкость, делая TypeScript ещё более мощным инструментом для разработки программного обеспечения.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile