我正在尝试编写一个简单的方法装饰器,它在调用原始方法之前执行一些简单的逻辑.我可以找到的所有示例都归结为最后调用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;
};
}