Как вернуть тип из колбэка без явного указания?

В TypeScript есть несколько способов вернуть тип из колбэка без явного указания.

1. Использование встроенной утилиты ReturnType. Эта утилита возвращает тип значения функции, переданной в качестве аргумента. Например:

function foo(callback: () => string): ReturnType<typeof callback> {
  return callback();
}

const result = foo(() => "Hello");

В этом коде мы передаем функцию () => "Hello" в качестве аргумента в функцию foo. Функция foo использует утилиту ReturnType для возвращения типа значения этой функции. Таким образом, переменная result будет иметь тип string.

2. Использование оператора typeof. Если функция-колбэк является свойством объекта или имеет имя, можно использовать оператор typeof для получения типа этой функции. Например:

const obj = {
  callback: () => "Hello"
};

type CallbackType = typeof obj.callback;

function foo(callback: CallbackType): ReturnType<CallbackType> {
  return callback();
}

const result = foo(obj.callback);

В этом примере функция-колбэк obj.callback имеет тип () => string. Мы сохраняем этот тип в CallbackType. Затем, используя CallbackType, мы указываем тип аргумента функции foo и возвращаемого значения.

3. Использование обобщений (generics). Обобщения позволяют параметризовать тип внутри функции, основываясь на типе аргумента. Например:

function foo<T>(callback: () => T): T {
  return callback();
}

const result = foo(() => "Hello");

В этом примере мы используем обобщение T для параметризации типа, возвращаемого функцией-колбэк. Тип T будет определен типом значения, возвращаемого функцией-колбэк. В этом случае переменная result будет иметь тип string.

Какой из этих подходов использовать зависит от конкретного контекста и требований вашего проекта.