'цей' неявно має тип 'будь-який', оскільки він не має анотації типу


124

Коли я включаю 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/isissue/13768 - не соромтеся відстежувати її та давати великі пальці.
Даніель Розенвассер

Відповіді:


139

Помилка дійсно виправляється, вставивши 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функціями та стрілками.


Який тип анотації потрібно мати "це", якщо ви використовуєте "це" в конструкторі?
BluE

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