当我在tsconfig中启用noImplicitThis。json,我得到这个错误的以下代码:

'this'隐式具有类型'any',因为它没有类型注释。

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`

一个解决方法是用对象替换它:

foo.on('error', (err: any) => {
  console.log(err);
  foo.emit('end');
});

但是如何正确地修复这个错误呢?


更新:事实证明,向回调中添加类型化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问题,以改进编译器的错误消息,并使用this和箭头函数突出显示实际的语法错误。


用于方法装饰器声明 配置"noImplicitAny": true, 您可以根据@tony19的答案显式地指定该变量的类型

function logParameter(this:any, target: Object, propertyName: string) {
  //...
}

你可以添加

 "noImplicitAny": false,

to

tsconfig.json

正如这里所说


在tsconfig中将“noImplicitAny”更改为false。Json没有帮助。尝试在tsconfig.json中执行"noImplicitThis": false


在typescript中,这是函数参数中的关键字。

请看这个答案。