Учитывая тип функции F, я хочу создать новый тип, который «компонуется перед» F, то есть он принимает и возвращает те же аргументы, что и F.Например:
const stringToNumber = (s: string) => s.length;
const stringToString: ComposableOn<(s: string) => number> = (s: string) => s + s;
const composedResult = stringToNumber(stringToString('a'));
Я не смог правильно определить тип ComposableOn
.Вот что я пробовал:
type ComposableBefore<F extends (...args: any) => any> = (args: Parameters<F>) => Parameters<F>;
type StoN = (s: string) => number;
const sToS: ComposableBefore<StoN> = (s: string) => s + s; // error: the type is [string] => [string] and not string => string
type ComposableBefore<F extends (...args: any) => any> = Parameters<F> extends Array<infer U>? (...args: Parameters<F>) => U: never;
const complex: ComposableBefore<(a: string, b: number, c: { d: number, e: string }) => number> = (a, b, c) => c; // not good either, since it can return a value of any type of the original function's argument types.
Как правильно набрать это?