'this' implicitamente tem o tipo 'any' porque não tem uma anotação de tipo


123

Quando eu permitir que noImplicitThisem tsconfig.json, eu recebo este erro para o seguinte código:

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

Adicionar um digitado thisaos parâmetros de retorno de chamada resulta no mesmo erro:

foo.on('error', (this: Foo, err: any) => { // error: `this` implicitly has type `any`

Uma solução alternativa é substituir thispelo objeto:

foo.on('error', (err: any) => {
  console.log(err);
  foo.emit('end');
});

Mas qual é a correção adequada para esse erro?


ATUALIZAÇÃO: Acontece que adicionar um digitado thisao retorno de chamada realmente resolve o erro. Eu estava vendo o erro porque estava usando uma função de seta com uma anotação de tipo para this:

playground datilografado


Você tentou fazer isso no TypeScript 2.1 ou na versão noturna?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

E agora vejo o motivo pelo qual WebStorm e TS playground estavam reclamando: eu estava usando uma função de seta enquanto fornecia uma anotação de tipo para this.
tony19

2
Anunciei um bug aqui: github.com/Microsoft/TypeScript/issues/13768 - fique à vontade para rastreá-lo e dar um joinha .
Daniel Rosenwasser

Respostas:


139

O erro é corrigido de fato inserindo thisuma anotação de tipo como o primeiro parâmetro de retorno de chamada. Minha tentativa de fazer isso foi fracassada, alterando simultaneamente o retorno de chamada em uma função de seta:

foo.on('error', (this: Foo, err: any) => { // DON'T DO THIS

Deveria ter sido assim:

foo.on('error', function(this: Foo, err: any) {

ou isto:

foo.on('error', function(this: typeof foo, err: any) {

Um problema do GitHub foi criado para melhorar a mensagem de erro do compilador e destacar o erro gramatical real com thisas funções de seta e.


Que tipo de anotação 'this' precisa ter, se você usar 'this' no construtor?
BluE

@BluE Supondo que uma propriedade / função de membro esteja sendo referenciada, thisseria o tipo da classe sendo inicializada. Por exemplo, se constructorfor para a classe MyClass, a anotação de tipo para thisseria MyClass.
tony19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.