Реализовать самостоятельно MyReturnType<T>, MyParameters<T> и MyAwaited<T> через ключевое слово infer.
Пример
type Fn = (a: number, b: string) => boolean;type R = MyReturnType<Fn>; // booleantype P = MyParameters<Fn>; // [number, string]type A = MyAwaited<Promise<Promise<number>>>; // number
Решение
Оптимальное решение
// infer «захватывает» тип в позиции внутри условного типа// Тип возврата функцииtype MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;// Кортеж типов аргументовtype MyParameters<T> = T extends (...args: infer P) => any ? P : never;// Рекурсивная распаковка вложенных Promisetype MyAwaited<T> = T extends Promise<infer U> ? MyAwaited<U> : T;
Как работает infer
infer R объявляет «переменную типа» прямо внутри условия T extends .... Если T подходит под шаблон, R связывается с реальным типом в этой позиции.
MyReturnType матчит любую функцию и извлекает то, что стоит после =>.
MyParameters ставит infer P в позицию списка аргументов → получаем кортеж.
MyAwaited рекурсивно снимает вложенные Promise, пока внутри не останется не-Promise тип.