Комментарии (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 типов. В обычной разработке редко пишешь сам, но часто используешь готовые типы из библиотек.