我正试图用Proxy来承诺类中的所有方法,如下所示:
class Person {
id = 1
getName(): string {
return "name"
}
getAge(): number {
return 1
}
}
const person = new Person();
const asyncPerson = new Proxy(person, {
get(target, prop, receiver) {
let fn = Reflect.get(target, prop, receiver)
if (typeof fn !== 'function') {
return fn
}
return (...args: any[]) => {
return new Promise((res, rej) => {
try {
res(fn.apply(receiver, args))
} catch (err) {
rej(err)
}
})
}
}
})
console.log(asyncPerson.id)
console.log(asyncPerson.getName())
问题是typescript认为asyncPerson
属于类型Person
。有什么方法可以定义一个正确反映asyncPerson
类型的新类型,而不必手动键入所有Person
的方法?
OTOH,是否有一种自动定义";承诺的";班
您可以使用条件类型创建一个"承诺的";一种类型的版本:
type Promisified<T> = {
[K in keyof T]: T[K] extends (...args: infer A) => infer R
? (...args: A) => Promise<R>
: T[K]
};
上面的实用程序将用promise包装方法的返回类型。
另一个警告是Proxy
构造函数定义总是返回与输入类型相同的值。为了克服这个问题,可以使用new Proxy<any>
或双重类型断言。
游乐场