Цель здесь состоит в том, чтобы создать одну функцию из двух функций с комбинацией аргументов. Это можно легко сделать с помощью JavaScript, но это не так просто с машинописным текстом.
Одним из способов объединения двух функций является прокси. Пример:
const f1 = (a: number) => {
return (a + 1) * 2;
}
const f2 = (b: string, c: string[]) => {
c.push(b);
return c;
}
const combiner = (f1: Function, f2: Function) => {
return new Proxy(f1, {
apply(target, thisArg, args) {
const f1_args = args.slice(0, f1.length);
const f2_args = args.splice(f1.length);
f1(...f1_args);
f2(...f2_args);
}
});
};
const f = combiner(f1, f2);
f(1, 'foo', ['bar']); // Typehints?
Вопрос в том, можно ли его напечатать с помощью машинописного текста, чтобы ввести результат функции combiner?
Тип возвращаемого значения вообще не имеет значения. Это зависит от того, что вы хотите от этого кода. Это может быть void как в моем примере или любой другой тип.
Решение для JavaScript в примере. Работает
Мне нужны подсказки для кода типа f(1, 'foo', ['bar']) вот и все



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ввод параметров комбинированной функции тривиально достигается с помощью двух универсальных типов A1 и A2, которые содержат типы кортежей параметров двух функций.
const combiner = <
A1 extends any[],
A2 extends any[]
>(f1: (...args: A1) => void, f2: (...args: A2) => void) => {
return new Proxy(f1, {
apply(target, thisArg, args) {
const f1_args = args.slice(0, f1.length);
const f2_args = args.splice(f1.length);
f1(...f1_args as A1);
f2(...f2_args as A2);
}
}) as unknown as (...args: [...A1, ...A2]) => void
};
Нам нужно только утверждать, что возвращаемый тип является функцией, которая имеет объединенные кортежи A1 и A2 в качестве типа параметра.
const f = combiner(f1, f2);
// ^? const f: (a: number, b: string, c: string[]) => void
f(1, 'foo', ['bar']);
Можете ли вы уточнить «создать одну функцию из двух функций»? Каким будет возвращаемое значение «комбинированной» функции? Можете ли вы включить свое решение, которое «легко реализовать с помощью JavaScript»?