Перейти к основному содержимому
Модуль 6 · Урок 1 из 211/14 в курсе~15 min
Уроки модуля (1/2)

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

Условные типы позволяют выражать нетривиальные решения о типах на основе отношений наследования. Синтаксис напоминает тернарный оператор JavaScript:

TS
T extends U ? X : Y

Если тип T можно назначить U, то результирующим типом будет X, в противном случае это будет Y.


Основные условные типы

Условный тип оценивает условие во время компиляции:

TS
type IsNumber<T> = T extends number ? true : false;

type A = IsNumber<number>; // true
type B = IsNumber<string>; // false

Этот шаблон чрезвычайно эффективен в сочетании с универсальными шаблонами для создания гибких и динамических типов утилит.


Введите извлечение с помощью infer.

Внутри предложения extends условного типа мы можем использовать ключевое слово infer, чтобы объявить переменную типа, которая будет выведена компилятором.

Например, если мы хотим извлечь тип возвращаемого значения функции:

TS
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

type ExampleFunction = () => string;
type Return = GetReturnType<ExampleFunction>; // string

В этом примере infer R сообщает TypeScript автоматически определить тип возвращаемого значения функции и сделать его доступным как R в положительной ветви условия.


Попробуйте сами

Упражнение 1. Тип IsString

Упражнение#ts.m6.l1.e1
Попыток: 0Загрузка…

Создайте универсальный тип с именем IsString<T>, который возвращает литеральный тип true, если T расширяет строку, в противном случае — false.

Загрузка редактора…
Показать подсказку

Используйте тип синтаксиса IsString<T> = T расширяет строку? правда: ложь; чтобы проверить тип.

Решение доступно после 3 попыток

Упражнение 2. Извлечение типа из массива с помощью infer

Упражнение#ts.m6.l1.e2
Попыток: 0Загрузка…

Определите универсальный тип UnpackArray<T>, который использует вывод для извлечения типа элемента массива T. Если T — массив (например, U[]), верните U, в противном случае верните тот же тип T.

Загрузка редактора…
Показать подсказку

Использовать T расширяет (вывод U)[] ? U : T для объявления и возврата переменной выведенного типа U.

Решение доступно после 3 попыток