'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');
});

Но как правильно исправить эту ошибку?


ОБНОВЛЕНИЕ: Оказывается, добавление набранного this к обратному вызову действительно устраняет ошибку. Я видел ошибку, потому что использовал стрелочную функцию с аннотацией типа для this:

Машинописная площадка


person tony19    schedule 30.01.2017    source источник
comment
Вы пробовали это на TypeScript 2.1 или ночной версии?   -  person Daniel Rosenwasser    schedule 30.01.2017
comment
@DanielRosenwasser 2.1.4   -  person tony19    schedule 30.01.2017
comment
И теперь я вижу причину, по которой WebStorm и TS площадка жаловались: я использовал стрелочную функцию, предоставляя аннотацию типа для this.   -  person tony19    schedule 31.01.2017
comment
Я зарегистрировал здесь ошибку: github.com/Microsoft/TypeScript/issues/13768 - не стесняйтесь отслеживать это и поднимать палец вверх.   -  person Daniel Rosenwasser    schedule 31.01.2017


Ответы (3)


Ошибка действительно исправляется путем вставки 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 и стрелочные функции.

person tony19    schedule 30.01.2017

Для объявления декоратора метода с конфигурацией "noImplicitAny": true, вы можете указать тип этой переменной явно в зависимости от ответа @tony19

function logParameter(this:any, target: Object, propertyName: string) {
  //...
}
person mustafa kemal tuna    schedule 25.12.2020

можете добавить

 "noImplicitAny": false,

to

tsconfig.json

как говорится, здесь

person Diego    schedule 29.06.2021