function f1(res: string) { console.log("F1: " + res); return 1; } function f2(res: number) { console.log("F1: " + res); return { hoho: "xd" }; } function f3(abc: { hoho: string }) { return { uu: "XD" }; } declare function compose(f2: (arg: TResult1) => TResult, f1: (arg: TArg) => TResult1): (arg: TArg) => TResult; declare function compose(f3: (arg: TResult2) => TResult, f2: (arg: TResult1) => TResult2, f1: (arg: TArg) => TResult1): (arg: TArg) => TResult; const xd = compose(f2, f1); const xd2 = compose(f3, f2, f1);