'this' hat implizit den Typ 'any', da es keine Typanmerkung gibt


123

Wenn ich ermöglichen noImplicitThisin tsconfig.json, bekomme ich diesen Fehler für den folgenden Code:

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

Das Hinzufügen einer Eingabe thiszu den Rückrufparametern führt zu demselben Fehler:

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

Eine Problemumgehung besteht darin, sie thisdurch das Objekt zu ersetzen :

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

Aber was ist die richtige Lösung für diesen Fehler?


UPDATE: Es stellt sich heraus, dass das Hinzufügen eines Typs thiszum Rückruf tatsächlich den Fehler behebt. Ich habe den Fehler gesehen, weil ich eine Pfeilfunktion mit einer Typanmerkung für Folgendes verwendet habe this:

Typoskript Spielplatz


Haben Sie dies mit TypeScript 2.1 oder der nächtlichen Version versucht?
Daniel Rosenwasser

@ DanielRosenwasser 2.1.4
Tony19

Und jetzt sehe ich den Grund, warum sich WebStorm und TS-Spielplatz beschwert haben: Ich habe eine Pfeilfunktion verwendet, während ich eine Typanmerkung für bereitgestellt habe this.
Tony19

2
Ich habe hier einen Fehler gemeldet : github.com/Microsoft/TypeScript/issues/13768 - zögern Sie nicht, ihn zu verfolgen und einen Daumen hoch zu geben.
Daniel Rosenwasser

Antworten:


139

Der Fehler wird tatsächlich behoben, indem thisals erster Rückrufparameter eine Typanmerkung eingefügt wird. Mein Versuch, dies zu tun, wurde verpfuscht, indem gleichzeitig der Rückruf in eine Pfeilfunktion geändert wurde:

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

Es hätte das sein sollen:

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

oder dieses:

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

Ein GitHub- Problem wurde erstellt, um die Fehlermeldung des Compilers zu verbessern und den tatsächlichen Grammatikfehler mit thisund Pfeilfunktionen hervorzuheben .


Welche Typanmerkung muss 'this' haben, wenn Sie 'this' im Konstruktor verwenden?
BluE

@BluE Angenommen, auf eine Member-Eigenschaft / -Funktion wird verwiesen, thiswäre dies der Typ der Klasse, die initialisiert wird. Wenn zum Beispiel der constructorfür die Klasse ist MyClass, für die Typanmerkung thiswäre MyClass.
Tony19
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.