0Pricing
TypeScript Academy · Урок

Понимание 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 — локальная установка не требуется.

Все уроки этого курса

  1. Понимание infer в условных типах
  2. Создание ReturnType и Parameters с нуля
  3. Шаблоны вывода во вложенных структурах
  4. Практическое применение infer: разворачивание обещаний
← Назад к TypeScript Academy