Уроки модуля (1/2)
Условные типы и вывод
Условные типы позволяют выражать нетривиальные решения о типах на основе отношений наследования. Синтаксис напоминает тернарный оператор JavaScript:
T extends U ? X : YЕсли тип T можно назначить U, то результирующим типом будет X, в противном случае это будет Y.
Основные условные типы
Условный тип оценивает условие во время компиляции:
type IsNumber<T> = T extends number ? true : false;
type A = IsNumber<number>; // true
type B = IsNumber<string>; // falseЭтот шаблон чрезвычайно эффективен в сочетании с универсальными шаблонами для создания гибких и динамических типов утилит.
Введите извлечение с помощью infer.
Внутри предложения extends условного типа мы можем использовать ключевое слово infer, чтобы объявить переменную типа, которая будет выведена компилятором.
Например, если мы хотим извлечь тип возвращаемого значения функции:
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
Создайте универсальный тип с именем IsString<T>, который возвращает литеральный тип true, если T расширяет строку, в противном случае — false.
Показать подсказку
Используйте тип синтаксиса IsString<T> = T расширяет строку? правда: ложь; чтобы проверить тип.
Решение доступно после 3 попыток
Упражнение 2. Извлечение типа из массива с помощью infer
Определите универсальный тип UnpackArray<T>, который использует вывод для извлечения типа элемента массива T. Если T — массив (например, U[]), верните U, в противном случае верните тот же тип T.
Показать подсказку
Использовать T расширяет (вывод U)[] ? U : T для объявления и возврата переменной выведенного типа U.
Решение доступно после 3 попыток