← Назад к вопросам

Для чего используется оператор Infer?

3.0 Senior🔥 171 комментариев
#TypeScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Для чего используется оператор Infer?

infer — мощный оператор TypeScript для извлечения типов из более сложных типов. Это работает в conditional types.

Базовый пример:

// Извлечение типа элемента из массива
type Flatten<T> = T extends Array<infer U> ? U : T;

type NumArray = [1, 2, 3];
type Num = Flatten<NumArray>; // Num = number

type Str = Flatten<string>; // Str = string

Вот что произошло:

  • infer U означает "запомни тип элемента U"
  • Если T это массив, возвращаем тип элемента U
  • Если нет, возвращаем T как есть

Где это полезно:

1. Извлечение типов функций

type GetReturnType<T> = T extends (...args: any) => infer R ? R : never;

const add = (a: number, b: number) => a + b;
type AddReturnType = GetReturnType<typeof add>; // number

2. Распаковка Promise

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

type Result = Awaited<Promise<string>>; // string
type Direct = Awaited<number>; // number

3. Кортежи и параметры

type FirstParam<T> = T extends (first: infer F, ...rest: any) => any ? F : never;

const getUserId = (id: number, name: string) => id;
type IdType = FirstParam<typeof getUserId>; // number

4. Извлечение из объектов

type GetProperty<T, K extends keyof T> = T[K];

interface User {
  id: number;
  name: string;
}

type UserId = GetProperty<User, 'id'>; // number

Real-world пример:

// Автоматически извлекаем success/error типы из API Response
type ApiResponse<T> = 
  | { status: 'success'; data: T }
  | { status: 'error'; error: string };

type ExtractSuccess<T> = T extends ApiResponse<infer U> ? U : never;

type UserData = ExtractSuccess<ApiResponse<{id: number}>>; // {id: number}

Частые ошибки:

  • infer работает ТОЛЬКО в conditional types (T extends ...)
  • Можно использовать infer несколько раз
  • Типы распаковываются слева направо

Это advanced TypeScript, нужен для создания utility типов. В обычной разработке редко пишешь сам, но часто используешь готовые типы из библиотек.