Как я могу аннотировать функцию, которая принимает обратный вызов, и иметь тип возвращаемого значения такой функции, выведенный из типа возвращаемого обратного вызова?
// say that callback takes a number
function takesCallback(cb: (arg:number) => infer T /* error */ ) {
return cb(42)
}
takesCallback(x => 'foo') // should infer 'string'






Здесь вы можете использовать помощник ReturnType, также необходимо переписать общую структуру, чтобы ее можно было ограничить функцией.
function takesCallback<T extends (...args: unknown[]) => unknown>(callback: T): ReturnType<T> {
return callback(42) as ReturnType<T>;
}
const res1 = takesCallback(x => 'foo'); // string
const res2 = takesCallback(x => 123); // number