Ключевое слово infer

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

Тренажер по TypeScript

Ключевое слово infer — это одна из самых мощных возможностей в Conditional Types (условных типах). Оно позволяет объявить переменную типа внутри условия extends, чтобы «вытащить» (вывести) тип из другой структуры.

Чаще всего infer используется для:

  • Получения типа возвращаемого значения функции (ReturnType).
  • Получения типа элементов массива.
  • «Распаковки» промисов или других оберток.

Синтаксис выглядит так: T extends SomeType ? U : T. Если TypeScript может сопоставить T с шаблоном, он запишет выведенный тип в U, и мы сможем использовать его в ветке «true».

Список тем

1. Структура infer

id: 40753_inf_01_highlight

В условном типе TypeScript разметьте ключевые компоненты, связанные с использованием ключевого слова infer. Определите, где находится ключевое слово infer, имя новой переменной типа, и где эта переменная используется в ветке true условного типа.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
type ReturnType<T> = T extends (...args: any[]) => {{infer~|~t1}} {{R~|~t2}} ? {{R~|~t3}} : any;
Использование переменной
Имя переменной типа
Ключевое слово infer
Сообщения
Проверить
Показать подсказку

2. Написание Unpacked

id: 40753_inf_02_replace

В этом задании вам нужно создать условный тип Unpacked, который извлекает тип элемента из массива. Используйте ключевое слово extends для проверки условия, infer для вывода типа элемента и синтаксис массива для завершения условного типа. Заполните пропуски так, чтобы тип Unpacked корректно извлекал тип элемента из массива T.

Заполните пропуски
type Unpacked<T> = T input1S (input2S U)input3S ? U : T;

// Примеры использования
type StringArray = string[];
type StringType = Unpacked<StringArray>; // string

type NumberArray = number[];
type NumberType = Unpacked<NumberArray>; // number
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Типы infer

id: 40753_inf_03_sort

Перед вами несколько примеров условных типов TypeScript с использованием ключевого слова `infer`. Распределите их по двум категориям: те, где `infer` извлекает тип аргумента функции, и те, где `infer` извлекает тип возвращаемого значения функции. Обратите внимание на контекст, в котором используется `infer` — внутри условного типа после `extends`, где проверяется соответствие шаблону функции.

Перетяните элементы в соответствующие блоки
Тип аргумента функции
Тип возвращаемого значения функции
type FirstParam<T> = T extends (first: infer F, ...rest: any[]) => any ? F : never;
type Return<T> = T extends (...args: any[]) => infer R ? R : never;
type Params<T> = T extends (...args: infer P) => any ? P : never;
type SecondParam<T> = T extends (first: any, second: infer S, ...rest: any[]) => any ? S : never;
type PromiseReturn<T> = T extends (...args: any[]) => Promise<infer R> ? R : never;
type ConstructorReturn<T> = T extends new (...args: any[]) => infer R ? R : never;
Сообщения
Проверить
Показать подсказку

4. Логика вывода типа

id: 40753_inf_04_analyze

Проанализируйте TypeScript-код сверху, который определяет условный тип ReturnType и применяет его к нескольким функциям. Восстановите последовательность шагов, описывающих логику работы ReturnType. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как TypeScript выводит тип возвращаемого значения функции.

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;

function foo(): string { return 'hello'; }
type FooReturn = ReturnType<typeof foo>; // string

function bar(): number { return 42; }
type BarReturn = ReturnType<typeof bar>; // number

function baz() { return true; }
type BazReturn = ReturnType<typeof baz>; // boolean
Расположите элементы в логичном порядке
Вывод типа возвращаемого значения R с помощью ключевого слова infer
Если условие ложно, возвращается тип never (ложная ветвь)
Условная проверка: является ли T функцией (T extends (...args: any) => infer R)
Проверка ограничения типа T: T должен быть функцией (T extends (...args: any) => any)
Если условие истинно, возвращается выведенный тип R (истинная ветвь)
Сообщения
Проверить
Показать подсказку

5. Область видимости infer

id: 40753_inf_05_error

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

Найдите ошибку и исправьте
type GetType<T> =
  T extends Promise<infer U>
    ? string
    : U;
// Ошибка: U виден только в true-ветке
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Распаковка Promise

id: 40753_inf_06_build

Соберите утилитный тип на TypeScript, который извлекает внутренний тип значения из Promise. Используйте ключевое слово infer в условном типе. Из предложенных строк соберите корректное определение типа, игнорируя лишние строки, которые не относятся к решению задачи.

Перетяните в правильном порядке строки из одного блока в другой
type UnwrapPromise<T> =
  T extends Promise<infer Value>
    ? Value
    : never;
type PromiseType<T> = T extends Promise<T> ? T : never;
  T extends infer U ? U : never
type ExtractPromise<T> = Promise<T>;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Результат вывода

id: 40753_inf_07_give

В данном задании вам предстоит проанализировать условный тип TypeScript, использующий ключевое слово infer. Изучите предоставленный код и определите, какой тип будет присвоен переменной Result. Введите ответ в виде одного слова — названия типа (например, string, number, boolean и т.д.) без кавычек и дополнительных символов.

Что должно получиться?
type Unpack<T> = T extends (infer U)[] ? U : T;
type Result = Unpack<string[]>;
Сообщения
Проверить
Показать подсказку

8. Infer в аргументах

id: 40753_inf_08_select

В этом задании вам предстоит заполнить пропуски в определении условного типа `MyParameters`, который должен извлекать типы параметров функции. Выберите из выпадающего списка подходящие элементы, чтобы тип `MyParameters` был эквивалентен встроенному типу `Parameters`. Обратите внимание на использование ключевого слова `infer` и типов `any`, `never`.

Нужно правильно расставить в пропуски предложенные варианты
type MyParameters<T> = T extends (...args: input1S) => input2S ? input3S : input4S;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

TypeScript: компиляция и запуск

id: 40753_compiler
TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру