当我在noImplicitThis
中启用tsconfig.json
时,我收到以下代码的错误:
'this' implicitly has type 'any' because it does not have a type annotation.
class Foo implements EventEmitter {
on(name: string, fn: Function) { }
emit(name: string) { }
}
const foo = new Foo();
foo.on('error', function(err: any) {
console.log(err);
this.emit('end'); // error: `this` implicitly has type `any`
});
将类型化的this
添加到回调参数会导致相同的错误:
foo.on('error', (this: Foo, err: any) => { // error: `this` implicitly has type `any`
解决方法是将this
替换为对象:
foo.on('error', (err: any) => {
console.log(err);
foo.emit('end');
});
但是这个错误的正确解决方法是什么?
UPDATE:事实证明,在回调中添加一个类型this
确实可以解决错误。我看到了错误,因为我使用的箭头函数带有this
的类型注释:
答案 0 :(得分:86)
通过插入带有类型注释的this
作为第一个回调参数,确实修复了错误。我试图通过同时将回调更改为箭头函数来实现这一目的:
foo.on('error', (this: Foo, err: any) => { // DON'T DO THIS
它应该是这样的:
foo.on('error', function(this: Foo, err: any) {
或者这个:
foo.on('error', function(this: typeof foo, err: any) {
创建了一个GitHub issue来改进编译器的错误消息,并使用this
和箭头函数突出显示实际的语法错误。
答案 1 :(得分:1)
对于方法装饰器声明
使用配置 "noImplicitAny": true,
您可以根据@tony19 的回答明确指定此变量的类型
function logParameter(this:any, target: Object, propertyName: string) {
//...
}
答案 2 :(得分:0)