我正在尝试在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):任何=> {
我得到了这个错误:
类型'(...args: any) => any‘不可赋值给类型’T‘。.ts(2322)
发布于 2019-02-11 01:53:58
解决方案
将您的descriptor
定义为PropertyDescriptor
而不是TypedPropertyDescriptor<T>
。
(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
/* ... */
}
说明
由于您的装饰器在创建时并没有考虑到任何特定的方法,因此不可能预先确定TypedPropertyDescriptor<T>
中的T
是什么。如果我们不知道T
是什么,我们就不能重写它,因为不能保证我们的重写与T
的类型相同。任何写入descriptor.value
的尝试都将引发错误。
另一方面,PropertyDescriptor
的定义更宽松,更适合您正在创建的通用生成器。
https://stackoverflow.com/questions/54621589
复制