gpt4 book ai didi

typescript - 如何为 descriptor.value 分配一个新函数?

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:26 25 4
gpt4 key购买 nike

我正在尝试在 typescript 中实现一个日志装饰器,但我可以重新分配 descriptor.value

我正在使用 target: "es6"并启用 experimentalDecorators 和 emitDecoratorMetadata 进行编译我添加了 MethodDecorator 和通用签名,但无法为描述符重新赋值

export function log(configs: any): MethodDecorator {
return <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void => {
debugger;
const originalMethod = descriptor.value;
descriptor.value = (...args: any): any => {
console.log('ENTRY ');
console.dir(args);
const ret = originalMethod.apply(target, args);
console.log('EXIT ');
console.dir(ret);
return ret
}
return descriptor;
}
}

这应该允许我创建日志包装函数但在行中

descriptor.value = (...args: any): any => {

我收到这个错误:

类型 '(...args: any) => any' 不可分配给类型 'T'.ts(2322)

最佳答案

解决方案

将您的 descriptor 定义为 PropertyDescriptor 而不是 TypedPropertyDescriptor<T>

(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => { 
/* ... */
}

解释

由于您的装饰器在创建时并未考虑任何特定方法,因此无法提前确定 T 中的 TypedPropertyDescriptor<T> 是什么。如果我们不知道 T 是什么,我们就不能覆盖它,因为不能保证我们的覆盖与 T 的类型相同。任何写入 descriptor.value 的尝试都会引发错误。

另一方面,PropertyDescriptor 的定义更加宽松,适合像您正在创建的通用生成器。

关于typescript - 如何为 descriptor.value 分配一个新函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54621589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com