188 votes

this a implicitement le type 'any' parce qu'il n'a pas d'annotation de type.

Lorsque j'active noImplicitThis sur 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'une this aux paramètres de la fonction 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 avec l'objet :

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

Mais quelle est la bonne solution pour corriger cette erreur ?


UPDATE : Il s'avère que l'ajout d'un this à la fonction de rappel répond en effet à l'erreur. Je voyais l'erreur parce que j'utilisais une fonction flèche avec une annotation de type de this :

typescript playground

0 votes

Avez-vous essayé cela sur TypeScript 2.1 ou la version nightly ?

0 votes

@DanielRosenwasser 2.1.4

0 votes

Et je vois maintenant la raison pour laquelle WebStorm et TS playground se plaignaient : J'utilisais une fonction flèche alors que je fournissais une annotation de type pour this .

210voto

tony19 Points 21531

L'erreur est en effet corrigée en insérant this avec une annotation de type comme premier paramètre de rappel. Ma tentative de faire cela a été bâclée par la transformation simultanée de la fonction de rappel en une fonction 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 ceci :

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

Un GitHub numéro a été créé pour améliorer le message d'erreur du compilateur et mettre en évidence la véritable erreur de grammaire avec this et les fonctions-flèches.

4voto

Pour la déclaration du décorateur de méthode avec la configuration "noImplicitAny": true, vous pouvez spécifier le type de cette variable explicitement dépend de la réponse de @tony19

function logParameter(this:any, target: Object, propertyName: string) {
  //...
}

1voto

Diego Points 33

Vous pouvez ajouter

 "noImplicitAny": false,

à

tsconfig.json

comme il est dit aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X