【问题标题】:how do I assign a new function to descriptor.value?如何为descriptor.value分配一个新函数?
【发布时间】:2019-07-04 10:01:52
【问题描述】:

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

【问题讨论】:

    标签: typescript decorator


    【解决方案1】:

    解决方案

    descriptor 定义为PropertyDescriptor 而不是TypedPropertyDescriptor&lt;T&gt;

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

    说明

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多