typescript “this”隐式具有类型“any”,因为它没有类型注解

7gyucuyw  于 2023-01-27  发布在  TypeScript
关注(0)|答案(5)|浏览(366)

当我在tsconfig.json中启用noImplicitThis时,我收到以下代码的错误:

'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类型注解的arrow函数:

sxissh06

sxissh061#

通过插入this并将类型注解作为第一个回调参数,这个错误确实得到了修复。我尝试这样做的同时将回调改为一个arrow-function,结果失败了:

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和arrow-function突出显示实际的语法错误。

bzzcjhmw

bzzcjhmw2#

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

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

oknwwptz3#

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

watbbzwu

watbbzwu4#

在类型脚本中,this是函数参数中的关键字
参见this answer

kcugc4gi

kcugc4gi5#

您可以添加

"noImplicitAny": false,

tsconfig.json

如这里所说

相关问题