'bu' örtük olarak 'herhangi' türüne sahiptir çünkü bir tür ek açıklaması yoktur


124

Ben etkinleştirdiğinizde noImplicitThisiçinde tsconfig.json, ben şu kodu bu hatayı alıyorum:

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

thisGeri arama parametrelerine bir typed eklemek aynı hataya neden olur:

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

Geçici bir çözüm, thisnesneyi değiştirmektir :

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

Ancak bu hata için doğru düzeltme nedir?


GÜNCELLEME: Geri aramaya bir yazılanın eklenmesi thisgerçekten hatayı giderir. Hatayı görüyordum çünkü aşağıdakiler için tür ek açıklamasına sahip bir ok işlevi kullanıyordum this:

daktilo oyun alanı


Bunu TypeScript 2.1'de mi yoksa gecelik sürümde mi denediniz?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

Ve şimdi WebStorm ve TS oyun alanının şikayet etmesinin nedenini anlıyorum: Bir tür ek açıklaması sağlarken bir ok işlevi kullanıyordum this.
tony19

Yanıtlar:


139

Hata, thisilk geri arama parametresi olarak bir tür ek açıklaması eklenerek gerçekten düzeltildi . Bunu yapma girişimim, geri aramayı aynı anda bir ok işlevine dönüştürerek başarısız oldu:

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

Bu olmalıydı:

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

veya bu:

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

Derleyicinin hata mesajını iyileştirmek ve gerçek gramer hatasını ve ok işlevleriyle vurgulamak için bir GitHub sorunu oluşturuldu this.


Yapıcıda 'this' kullanırsanız, 'this' ne tür bir ek açıklamaya sahip olmalıdır?
BluE

@BluE Bir üye özelliğine / işlevine başvurulduğunu varsayarsak, thisbaşlatılan sınıfın türü olur. Örneğin, constructorsınıf için MyClassise, tür ek açıklaması thisolacaktır MyClass.
tony19
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.