Утилиты 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[][][]>; // booleanUnwrapPromise: один уровень
Снимите один слой 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 — локальная установка не требуется.
Все уроки этого курса
- DeepPartial и DeepReadonly
- Утилиты Flatten и UnwrapPromise
- TupleToUnion и UnionToIntersection
- Публикация библиотеки утилит типов