Я думаю, что промежуточное решение, вероятно, является лучшим, поскольку оно хорошо работает и для перегрузок, но вы также можете использовать Object.assign
для получения аналогичного эффекта:
let f: FnWithProps = Object.assign(function double(x: number) {
return x * x;
},{
a : 'Hello',
b : 'Goodbye'
});
Хотя это означает, что мы не получаем вывод для параметров функции или свойств.
Если это обычный сценарий для вас, мы можем построить служебную функцию, чтобы получить заключение для всего:
interface FnWithProps {
(x: number): number;
a: string;
b: string;
}
function functionWithProps<T extends (...a: any[]) => any>(fn: (...a: Parameters<T>) => ReturnType<T>, props: Pick<T, keyof T>){
return Object.assign(fn, props);
}
let f = functionWithProps<FnWithProps>(function double(x) { // annotation not necesary
return x * x;
},{
a : 'Hello', // helpful intelisense here
b : 'Goodbye'
});