0Pricing
TypeScript Academy · Урок

Утилиты Flatten и UnwrapPromise

Пишите типы, разворачивающие вложенные обобщённые структуры

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

Проблема разворачивания

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

type Flatten<T> = T extends (infer U)[] ? Flatten<U> : T;
type A = Flatten<number[][][]>; // number
type B = Flatten<string[]>;     // string

Нерекурсивное разворачивание (один уровень)

Разворачивание одного уровня соответствует Array.prototype.flat(1) — оно снимает ровно один уровень вложенности.

type FlatOnce<T> = T extends (infer U)[] ? U : T;
type A = FlatOnce<number[][]>; // number[]
type B = FlatOnce<string[]>;   // string

Рекурсивное разворачивание

Рекурсивная версия имитирует Array.prototype.flat(Infinity), выполняя рекурсию, пока не останется оболочек массивов.

type Flatten<T> = T extends (infer U)[] ? Flatten<U> : T;
type C = Flatten<boolean[][][]>; // boolean

UnwrapPromise: один уровень

Снимите один слой Promise с помощью infer.

type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type D = UnwrapPromise<Promise<string>>; // string
type E = UnwrapPromise<number>;          // number

Глубокий UnwrapPromise

Рекурсивно снимите оболочки с вложенных обещаний — это эквивалент встроенного типа Awaited.

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

Объединение Flatten и UnwrapPromise

Объединённый тип обрабатывает и обещания, и массивы, что полезно для асинхронных функций, возвращающих массивы.

type Simplify<T> =
  T extends Promise<infer U> ? Simplify<U>
  : T extends (infer V)[] ? Simplify<V>
  : T;

type G = Simplify<Promise<string[][]>>; // string

Встроенный Awaited<T>

Начиная с TypeScript 4.5 поставляется Awaited, который рекурсивно снимает оболочки с thenable-типов, включая thenable-типы, не являющиеся Promise.

type H = Awaited<Promise<Promise<string>>>; // string
// Also handles custom thenables with .then()

Разворачивание значений Map

Тот же шаблон с infer извлекает типы значений из Map.

type MapValue<T> = T extends Map<any, infer V> ? V : never;
type I = MapValue<Map<string, number[]>>; // number[]

FlattenObject: объединение вложенных интерфейсов

Разворачивающий объектный тип на уровне типов объединяет вложенные типы объектов — это сложнее, но полезно для глубокого объединения конфигураций.

// This requires recursive mapped types + intersection spreading
// See the DeepPartial lesson for the base pattern

Практическое применение: разворачивание ответов API

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

type ApiData<T> = { data: T; status: number };
type ExtractData<T> = T extends ApiData<infer D> ? D : T;
type J = ExtractData<ApiData<User[]>>; // User[]

Итоги: разворачивание и снятие оболочек

Flatten и UnwrapPromise используют рекурсивные условные типы с infer, чтобы снимать оболочки типов. Используйте Awaited для разворачивания обещаний, а для других структур пишите собственную рекурсию.

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

Что возвращает Flatten?

Что Вы узнали

Flatten и UnwrapPromise — это рекурсивные условные типы, снимающие обобщённые оболочки. Объединяйте их для упрощения сложных вложенных типов, а для цепочек обещаний используйте встроенный Awaited.

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

Урок «Утилиты Flatten и UnwrapPromise» бесплатный?

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

Чему я научусь в уроке «Утилиты Flatten и UnwrapPromise»?

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

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

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

Сколько времени занимает урок «Утилиты Flatten и UnwrapPromise»?

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

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

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

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

  1. DeepPartial и DeepReadonly
  2. Утилиты Flatten и UnwrapPromise
  3. TupleToUnion и UnionToIntersection
  4. Публикация библиотеки утилит типов
← Назад к TypeScript Academy