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


125

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

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


Вы пробовали это на TypeScript 2.1 или ночной версии?
Даниэль

@DanielRosenwasser 2.1.4
tony19

И теперь я вижу причину, по которой WebStorm и TS площадка жаловались: я использовал стрелочную функцию, предоставляя аннотацию типа для this.
tony19

2
Я зарегистрировал ошибку здесь: github.com/Microsoft/TypeScript/issues/13768 - не стесняйтесь отслеживать ее и поднимать палец вверх.
Даниэль

Ответы:


140

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


Какая аннотация типа должна быть у this, если вы используете this в конструкторе?
BluE 08

@BluE Предполагая, что имеется ссылка на свойство / функцию-член, thisэто будет тип инициализируемого класса. Например, если constructorкласс предназначен MyClass, аннотация типа для класса thisбудет MyClass.
tony19 08
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.