如何在Typescript中为具有Proxy的方法重新定义返回类型



我正试图用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>或双重类型断言。

游乐场

最新更新