Подтвердить что ты не робот

'this' неявно имеет тип 'any', потому что у него нет аннотации типа

Когда я включаю 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:

typescript игровая площадка

4b9b3361

Ответ 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) {

A GitHub issue был создан для улучшения сообщения об ошибке компилятора и выделения фактической ошибки грамматики с помощью this и стрелочных функций.