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

时间:2018-12-18 16:28:53

标签: typescript decorator typescript-decorator

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

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

我尝试通过调用originalMethod.apply(this as any, 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),但是在上面的示例中使用this即可
  • 如果装饰器上的正式文档使用了我示例中的构造(请参见Property Decorators section),则它可以正常工作,但与noImplicitThis编译器选项冲突... < / li>

2 个答案:

答案 0 :(得分:1)

我认为您无法真正获得类型安全性,但是如果您只是想消除类型错误,则可以明确地说出chart.plots[0].data_labels.show_category_name = True (第三行):

this: any

答案 1 :(得分:0)

感谢@Grassator的启发-这是一个有效的版本。我不相信在当前TypeScript状态下可以安全地完成此操作。

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

...

> t2.test(5)
hello!
1 '->' 5