Я хочу создать обобщенную функцию c, которая принимает две функции в качестве параметров и возвращает результат. Я хочу, чтобы типы обеспечивали, чтобы обе функции имели одинаковую подпись, но не то, что эта подпись равна (кроме возвращаемого типа).
Я могу определить введите таким образом:
type Func<TResult> = (...args: any[]) => TResult;
function foo<TResult>(f: Func<TResult>, g: Func<TResult>): TResult { ... }
Который разрешает нужные параметры:
function f1(s: string, i: number): boolean { return true; }
function g1(s: string, i: number): boolean { return false; }
foo<boolean>(f1, g1);
К сожалению, он также разрешает функции с разными сигнатурами:
function g2(b: boolean): boolean { return false; }
foo<boolean>(f1, g2);
Возможно ли разрешить скомпилировать первый вызов, но не последний?
Обратите внимание, что я хочу, чтобы это работало для любого списка параметров (пустой, один параметр, два параметра и т. д. c.), но типы параметров для обеих функций должны совпадать.