TypeScript方法装饰器 – 启用noImplicitThis的`this`

我正在尝试编写一个简单的方法装饰器,它在调用原始方法之前执行一些简单的逻辑.我可以找到的所有示例都归结为最后调用originalMethod.apply(this,args) – 但是在tsconfig.json中启用了noImplicitThis,我收到以下错误:

[eval].ts(1,224): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.

我尝试通过调用originalMethod.apply(这与任何,args)一起工作,但错误仍然存​​在.

问题:是否有任何变通方法可以调用原始方法,而不会为整个项目禁用noImplicitThis?

最小的例子 – 禁用noImplicitAny:

function logBeforeCall1(): originalMethodDecorator {
    return function(
        target: any,
        propertyKey: string | symbol,
        descriptor: PropertyDescriptor,
    ): PropertyDescriptor {
        const originalMethod = descriptor.value;
        descriptor.value = (...args: any[]) => {
            console.log('hello!');
            return originalMethod.apply(this, args);
        };
        return descriptor;
    };
}

class Test1 {
    private num: number = 1;

    @logBeforeCall1()
    test(next: number): void {
        console.log(this.num, '->', next);
        this.num = next;
    }
}

>我已经知道装饰器无法访问特定的对象实例(参见例如this question),但在上面的示例中使用它
>事件关于装饰器的官方文档使用我的示例中的构造(参见Property Decorators section),因此它可以工作,但与noImplicitThis编译器选项冲突…

最佳答案 我不认为你真的可以获得类型安全性,但如果你只是想摆脱类型错误,你可以明确地说这个:任何(第3行):

function logBeforeCall1() {
  return function (
    this: any,
    target: any,
    propertyKey: string | symbol,
    descriptor: PropertyDescriptor,
  ): PropertyDescriptor {
    const originalMethod = descriptor.value;
    descriptor.value = (...args: any[]) => {
      console.log('hello!');
      return originalMethod.apply(this, args);
    };
    return descriptor;
  };
}
点赞