我正在尝试在Typescript中实现日志装饰器,但是我可以重新分配描述符。值
我正在使用目标:“ 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:任何):任何=> {
我收到此错误:
类型'(... args:any)=>任何'都不能分配给类型'T'.ts(2322)
答案 0 :(得分:0)
解决方案
将descriptor
定义为PropertyDescriptor
,而不是TypedPropertyDescriptor<T>
。
(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
/* ... */
}
说明
由于未使用任何特定方法创建装饰器,因此无法提前确定T
中的TypedPropertyDescriptor<T>
。而且,如果我们不知道T
是什么,就不能覆盖它,因为不能保证我们的覆盖类型与T
相同。尝试写入descriptor.value
都会引发错误。
另一方面,PropertyDescriptor
的定义较为宽松,适用于您要创建的通用生成器。