'this' secara implisit memiliki tipe 'any' karena tidak memiliki penjelasan tipe


125

Ketika saya mengaktifkan noImplicitThismasuk tsconfig.json, saya mendapatkan kesalahan ini untuk kode berikut:

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

Menambahkan yang diketik thiske parameter callback menghasilkan kesalahan yang sama:

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

Solusinya adalah mengganti thisdengan objek:

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

Tapi apa perbaikan yang tepat untuk kesalahan ini?


UPDATE: Ternyata menambahkan yang diketik thiske callback memang mengatasi kesalahan tersebut. Saya melihat kesalahan karena saya menggunakan fungsi panah dengan anotasi tipe untuk this:

taman bermain naskah


Apakah Anda mencoba ini pada TypeScript 2.1 atau versi nightly?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

Dan sekarang saya melihat alasan WebStorm dan TS playground mengeluh: Saya menggunakan fungsi panah sambil memberikan anotasi tipe this.
tony19

2
Saya melaporkan bug di sini: github.com/Microsoft/TypeScript/issues/13768 - silakan lacak dan beri acungan jempol.
Daniel Rosenwasser

Jawaban:


140

Kesalahan memang diperbaiki dengan memasukkan thisdengan anotasi tipe sebagai parameter callback pertama. Upaya saya untuk melakukan itu gagal dengan secara bersamaan mengubah panggilan balik menjadi fungsi panah:

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

Seharusnya begini:

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

atau ini:

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

Sebuah GitHub masalah diciptakan untuk meningkatkan pesan kesalahan compiler dan menyoroti kesalahan tata bahasa yang sebenarnya dengan thisdan panah-fungsi.


Jenis anotasi apa yang 'ini' perlukan, jika Anda menggunakan 'ini' dalam konstruktor?
BluE

@BluE Dengan asumsi properti / fungsi anggota sedang direferensikan, thisakan menjadi jenis kelas yang diinisialisasi. Misalnya, jika constructoradalah untuk kelas MyClass, jenis anotasi untuk thisadalah MyClass.
tony19
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.