web-dev-qa-db-fra.com

'this' a implicitement le type 'any' car il n'a pas d'annotation de type

Lorsque j'active noImplicitThis dans tsconfig.json, j'obtiens cette erreur pour le code suivant:

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

L'ajout d'un this saisi aux paramètres de rappel entraîne la même erreur:

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

Une solution de contournement consiste à remplacer this par l'objet:

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

Mais quelle est la solution appropriée pour cette erreur?


UPDATE: Il s'avère que l'ajout d'un this saisi au callback corrige effectivement l'erreur. Je voyais l'erreur parce que j'utilisais une fonction de flèche avec une annotation de type pour this:

TypeScript playground

84
tony19

L'erreur est en effet corrigée en insérant this avec une annotation de type comme premier paramètre de rappel. Ma tentative en ce sens a été bâclée en changeant simultanément le rappel en une fonction de flèche:

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

Ça aurait dû être ça:

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

ou ca:

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

Un GitHub issue a été créé pour améliorer le message d'erreur du compilateur et mettre en évidence l'erreur de grammaire réelle avec this et les fonctions de flèche.

90
tony19