Как мне назначить новую функцию для descriptor.value? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь реализовать декоратор журналирования в машинописном тексте, но я могу переназначить descriptor.value

Я компилирую с target: "es6" и с включенным экспериментальным Decorator и 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)

1 Ответ

0 голосов
/ 11 февраля 2019

Решение

Определите ваше descriptor как PropertyDescriptor вместо TypedPropertyDescriptor<T>.

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

Объяснение

Поскольку ваш декоратор не создан с учетом какого-либо определенного метода, невозможно определить, что T в TypedPropertyDescriptor<T> заранее.И если мы не знаем, что такое T, мы не можем переопределить его, потому что нет никакой гарантии, что наше переопределение будет того же типа, что и T.Любая попытка записи в descriptor.value вызовет ошибку.

Определение для PropertyDescriptor, с другой стороны, более мягкое и подходит для генератора общего назначения, такого как тот, который вы создаете.

...