小编典典

'this' 隐含类型为 'any' 因为它没有类型注释

all

当我启用noImplicitThisin 时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');
});

但是这个错误的正确解决方法是什么?


更新: 事实证明this,在回调中添加类型确实解决了错误。我看到了错误,因为我使用了带有类型注释的箭头函数this

打字稿游乐场


阅读 74

收藏
2022-06-25

共1个答案

小编典典

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箭头函数突出显示实际的语法错误。

2022-06-25