我正在尝试编写一个简单的方法装饰器,该装饰器在调用原始方法之前执行一些简单的逻辑。我可以找到的所有示例都归结为最后调用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
即可noImplicitThis
编译器选项冲突... < / li>
答案 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