„this” ma niejawnie typ „any”, ponieważ nie ma adnotacji typu


124

Kiedy włączyć noImplicitThisw tsconfig.json, otrzymuję ten błąd za pomocą następującego kodu:

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

Dodanie wpisanego thisdo parametrów wywołania zwrotnego powoduje ten sam błąd:

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

Sposób obejścia problemu polega na zastąpieniu thisobiektu:

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

Ale jakie jest właściwe rozwiązanie tego błędu?


AKTUALIZACJA: Okazuje się, że dodanie wpisanego tekstu thisdo wywołania zwrotnego rzeczywiście rozwiązuje błąd. Widziałem błąd, ponieważ używałem funkcji strzałkowej z adnotacją typu dla this:

maszynopis zabaw


Czy próbowałeś tego w TypeScript 2.1 lub w wersji nightly?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

I teraz widzę powód, dla którego WebStorm i TS Playground narzekały: użyłem funkcji strzałkowej, jednocześnie udostępniając adnotację typu this.
tony19

2
Zgłosiłem błąd tutaj: github.com/Microsoft/TypeScript/issues/13768 - śledź go i daj kciuki w górę.
Daniel Rosenwasser

Odpowiedzi:


139

Błąd jest rzeczywiście naprawiony poprzez wstawienie thisz adnotacją typu jako pierwszym parametrem wywołania zwrotnego. Moja próba zrobienia tego zakończyła się niepowodzeniem, zmieniając jednocześnie wywołanie zwrotne w funkcję strzałki:

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

Powinno być tak:

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

albo to:

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

GitHub problem został stworzony w celu poprawy komunikat o błędzie kompilatora i podkreślają rzeczywisty błąd z gramatyki thisi Arrow-funkcje.


Jakiego typu adnotacja musi mieć „this”, jeśli użyjesz „this” w konstruktorze?
BluE,

@BluE Zakładając, że odwołuje się do właściwości / funkcji elementu członkowskiego, thisbędzie to typ inicjowanej klasy. Na przykład, jeśli constructorjest dla klasy MyClass, adnotacja typu dla thisbędzie MyClass.
tony19
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.