我如何分配一个新的函数给descriptor.value?

时间:2019-02-10 22:08:36

标签: typescript decorator

我正在尝试在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)

1 个答案:

答案 0 :(得分:0)

解决方案

descriptor定义为PropertyDescriptor,而不是TypedPropertyDescriptor<T>

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

说明

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

另一方面,PropertyDescriptor的定义较为宽松,适用于您要创建的通用生成器。