Не уверен, что для Ваших целей подходит, но как идея сойдёт:
https://codesandbox.io/s/eager-frost-5rm7ofunction promisify(obj) {
const cache = {}
return new Proxy(obj, {
get(target, prop) {
const value = target[prop]
const type = Object.prototype.toString.call(value)
if (type === '[object Object]') {
if (!cache[prop]) {
cache[prop] = promisify(value)
}
return cache[prop]
} else if (type === '[object Function]') {
if (!cache[prop]) {
cache[prop] = function (...args) {
return new Promise((resolve, reject) => {
const callback = (err, result) => {
if (err) {
reject(err)
} else {
resolve(result)
}
}
value.call(this, callback, ...args)
})
}
}
return cache[prop]
}
return value
},
})
}