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


125

Quand je permets noImplicitThisà tsconfig.json, je reçois 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 typé thisaux 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 thispar l'objet:

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

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


MISE À JOUR: Il s'avère que l'ajout d'un tapé thisau rappel corrige en effet l'erreur. Je voyais l'erreur car j'utilisais une fonction de flèche avec une annotation de type pour this:

aire de jeux dactylographiée


Avez-vous essayé cela sur TypeScript 2.1 ou la version nocturne?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

Et je vois maintenant la raison pour laquelle WebStorm et TS Playground se plaignaient: j'utilisais une fonction de flèche tout en fournissant une annotation de type pour this.
tony19

2
J'ai déposé un bogue ici: github.com/Microsoft/TypeScript/issues/13768 - n'hésitez pas à le suivre et à donner un coup de pouce.
Daniel Rosenwasser

Réponses:


140

L'erreur est en effet corrigée en insérant thisune annotation de type comme premier paramètre de rappel. Ma tentative de le faire a été ratée en changeant simultanément le rappel en une fonction de flèche:

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

Cela aurait dû être ceci:

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

ou ca:

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

Un problème GitHub a été créé pour améliorer le message d'erreur du compilateur et mettre en évidence l'erreur de grammaire réelle avec les thisfonctions fléchées.


Quel type d'annotation doit avoir «this» si vous utilisez «this» dans le constructeur?
BluE

@BluE En supposant qu'une propriété / fonction membre est référencée, thisserait le type de la classe en cours d'initialisation. Par exemple, si la constructorclasse est pour MyClass, l'annotation de type pour thisserait MyClass.
tony19
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.