0Pricing
TypeScript Academy · Урок

Шаблоны вывода во вложенных структурах

Применяйте infer рекурсивно для извлечения сложных типов

«Шаблоны вывода во вложенных структурах» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Зачем нужно глубокое выведение?

Иногда нужный Вам тип скрыт внутри нескольких уровней обобщений. Глубокое выведение использует рекурсивные или последовательные условные типы, чтобы добраться до него.

type DeepUnwrap<T> =
  T extends Promise<infer U>
    ? DeepUnwrap<U>
    : T;

type A = DeepUnwrap<Promise<Promise<string>>>; // string

Рекурсивные условные типы

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

type Flatten<T> = T extends Array<infer U> ? Flatten<U> : T;
type B = Flatten<string[][][]>; // string

Выведение из вложенных обобщённых типов

Можно объединить несколько переменных infer в одном предложении extends, чтобы одновременно сохранить несколько уровней.

type InnerValue<T> =
  T extends Map<any, infer V>
    ? V extends Set<infer S>
      ? S
      : V
    : T;
type C = InnerValue<Map<string, Set<number>>>; // number

Типы свойств глубоких объектов

Рекурсивные типы могут обходить структуры объектов, чтобы извлекать типы глубоко вложенных свойств.

type DeepGet<T, K extends keyof T> =
  T[K] extends object ? T[K] : never;

type Nested = { user: { profile: { name: string } } };
type Profile = DeepGet<Nested, "user">; // { profile: { name: string } }

Глубокое извлечение типов элементов массивов

Сочетание рекурсивной распаковки с обработкой массивов позволяет работать с вложенностью любой глубины.

type ElementType<T> = T extends (infer U)[] ? ElementType<U> : T;
type D = ElementType<number[][][]>; // number

Рекурсия по хвосту кортежа

Манипуляции с кортежами посредством хвостовой рекурсии — распространённый шаблон для конвейеров с проверкой типов и типов композиции функций.

type Last<T extends any[]> =
  T extends [...infer _, infer L] ? L : never;
type E = Last<[1, 2, 3]>; // 3

Ограничения глубины и практические соображения

TypeScript ограничивает глубину рекурсии, чтобы предотвращать бесконечные циклы. Делайте рекурсию неглубокой и при необходимости ограничивайте её счётчиком глубины.

// Deep recursion may hit "Type instantiation is excessively deep"
// Simplify or use branded types to break deep chains

Infer при распределении объединений

Когда T является объединением, условные типы распределяются: каждый член сопоставляется отдельно, а результаты объединяются.

type Unwrap<T> = T extends Promise<infer U> ? U : T;
type F = Unwrap<Promise<string> | Promise<number> | boolean>;
// string | number | boolean

Выведение из остаточных кортежей

Шаблоны остаточных кортежей с infer позволяют разделять кортеж на начало и хвост, а также выполнять вариативные манипуляции с типами.

type Init<T extends any[]> =
  T extends [...infer I, any] ? I : never;
type G = Init<[1, 2, 3, 4]>; // [1, 2, 3]

Практический пример: вложенный ответ API

Тип вложенного ответа API можно распаковать до типа данных с помощью последовательного применения infer.

type ApiResponse<T> = { data: T; status: number };
type UnwrapApi<T> = T extends ApiResponse<infer D> ? D : T;
type H = UnwrapApi<ApiResponse<{ users: string[] }>>; // { users: string[] }

Итоги: глубокое выведение

Глубокое выведение сочетает рекурсивные условные типы, несколько переменных infer и структурное сопоставление с шаблонами, чтобы извлекать типы из обобщённых структур с произвольной глубиной вложенности.

Быстрая проверка

Что возвращает Flatten, если Flatten = T extends Array ? Flatten : T?

Чему Вы научились

Глубокое выведение использует рекурсивные условные типы и последовательные шаблоны infer, чтобы добираться до типов, скрытых внутри нескольких обобщённых оболочек. Ограничивайте глубину рекурсии, чтобы не достигать ограничений TypeScript.

Часто задаваемые вопросы

Урок «Шаблоны вывода во вложенных структурах» бесплатный?

Да — полный текст урока «Шаблоны вывода во вложенных структурах» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблоны вывода во вложенных структурах»?

Применяйте infer рекурсивно для извлечения сложных типов Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Шаблоны вывода во вложенных структурах»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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