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
:
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.