Понимание infer в условных типах
Извлекайте внутренние типы с помощью infer в выражениях extends
«Понимание infer в условных типах» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Что такое infer?
Ключевое слово infer используется внутри условных типов и позволяет TypeScript сохранить переменную типа из соответствующей позиции, чтобы затем использовать её в истинной ветви.
type GetReturn<T> = T extends (...args: any[]) => infer R ? R : never;Простой пример infer
Здесь мы извлекаем тип возвращаемого значения любой функции с помощью infer R.
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type A = ReturnType<() => string>; // string
type B = ReturnType<() => number[]>; // number[]Как работает infer
TypeScript сопоставляет структуру T с шаблоном. Если структуры совпадают, выведенная переменная содержит соответствующую часть. В противном случае выбирается ложная ветвь.
type First<T> = T extends [infer F, ...any[]] ? F : never;
type X = First<[string, number, boolean]>; // stringВыведение из обобщённых параметров
Можно вывести аргумент типа обобщённого типа, например извлечь T из Promise.
type Unwrap<T> = T extends Promise<infer U> ? U : T;
type A = Unwrap<Promise<string>>; // string
type B = Unwrap<number>; // numberНесколько переменных infer
В одном условном типе можно использовать несколько предложений infer, чтобы одновременно сохранить несколько позиций.
type Head<T> = T extends [infer H, ...infer Tail] ? H : never;
type Tail<T> = T extends [infer H, ...infer Tail] ? Tail : never;infer в параметрах функций
infer также может сохранять типы параметров функции, а не только типы возвращаемых значений.
type FirstParam<T> = T extends (first: infer P, ...rest: any[]) => any ? P : never;
type A = FirstParam<(x: string, y: number) => void>; // stringРаспределительное поведение infer
Когда T является объединением, условные типы, в том числе типы с infer, распределяются по каждому члену объединения.
type UnwrapAll<T> = T extends Promise<infer U> ? U : T;
type X = UnwrapAll<Promise<string> | Promise<number>>;
// string | numberВложенный infer
Можно вкладывать infer, чтобы углубиться в структуру типа, например извлечь тип значения массива, находящегося внутри обещания.
type UnwrapPromiseArray<T> =
T extends Promise<infer U>
? U extends (infer V)[]
? V
: U
: T;infer и строковые шаблоны
Шаблонные строковые типы в сочетании с infer позволяют извлекать подстроки из строковых литеральных типов.
type GetDomain<T extends string> =
T extends `https://${infer Domain}` ? Domain : never;
type D = GetDomain<"https://example.com">; // "example.com"Распространённые ошибки
Infer работает только внутри предложения extends условного типа. Его использование в другом месте приводит к ошибке компиляции. Кроме того, infer недоступен в ложной ветви.
// Error: infer can only appear in extends clauses
type Bad<T> = infer R; // SyntaxErrorИтоги: infer
Ключевое слово infer позволяет TypeScript сохранять фрагмент типа при структурном сопоставлении в условном типе. На нём основаны такие типы-утилиты, как ReturnType, Parameters и Awaited.
Быстрая проверка
Где можно использовать ключевое слово infer?
Чему Вы научились
Ключевое слово infer обеспечивает сопоставление с шаблонами на уровне типов, извлекая фрагменты типов из структурных шаблонов. Это основа мощных типов-утилит и метапрограммирования с проверкой типов в TypeScript.
Часто задаваемые вопросы
Урок «Понимание infer в условных типах» бесплатный?
Да — полный текст урока «Понимание infer в условных типах» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Понимание infer в условных типах»?
Извлекайте внутренние типы с помощью infer в выражениях extends Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Понимание infer в условных типах»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание infer в условных типах
- Создание ReturnType и Parameters с нуля
- Шаблоны вывода во вложенных структурах
- Практическое применение infer: разворачивание обещаний