Дайте мне знать, если вы этого хотите? думаю, что это правильно.
const bindFn = <A extends keyof any, B>(obj: Record<A, B>, wrapFn: (fn: (arg: B) => B) => any): typeof obj => Object.entries(obj).reduce((carry, [key, fn])=>{
carry[key] = ( ...args: any[] ) => wrapFn(fn.apply(null, args))
return carry;
}, {})
const obj = { name: () => "my name is", age: () => "my age is" };
const result = bindFn(obj, (arg) => {
console.log("executed on");
return arg;
})
или выполненная функция, версия
const bindFn = <A extends keyof any, B , C>(obj: Record<A, B>, wrapFn: (fn: (arg: B) => any) => C): Record<A, C> => Object.entries(obj).reduce((carry, [key, fn])=>{
carry[key] = ( ...args: any[] ) => wrapFn(fn.apply(null, args))
return carry;
}, {})
const obj = { name: () => "my name is", age: () => "my age is" };
const result = bindFn(obj, (arg) => {
console.log("executed on");
return 5;
}) // {name: number, age: number}