typescript - 'this' secara implisit memiliki tipe 'any' karena tidak memiliki anotasi tipe


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

'this' secara implisit memiliki tipe 'any' karena tidak memiliki anotasi tipe.

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 this yang bertipe pada parameter callback menghasilkan kesalahan yang sama:

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

Solusi sementara adalah mengganti this dengan objek:

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

Tetapi apa perbaikan yang tepat untuk kesalahan ini?


PEMBARUAN: Ternyata menambahkan this yang bertipe pada callback memang mengatasi kesalahan tersebut. Saya melihat kesalahan itu karena saya menggunakan fungsi panah dengan anotasi tipe untuk this:

Jawaban #1

Kesalahan memang diperbaiki dengan menyisipkan this dengan anotasi tipe sebagai parameter callback pertama. Upaya saya untuk melakukannya gagal karena secara bersamaan mengubah callback menjadi fungsi panah:

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

Seharusnya seperti ini:

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

atau ini:

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

Sebuah isu GitHub dibuat untuk memperbaiki pesan kesalahan compiler dan menyoroti kesalahan tata bahasa yang sebenarnya dengan this dan fungsi panah.

Jawaban #2

Mengubah "noImplicitAny" menjadi false di tsconfig.json tidak membantu.

Cobalah menggunakan "noImplicitThis": false di tsconfig.json.

Jawaban #3

Untuk deklarasi dekorator metode dengan konfigurasi "noImplicitAny": true, Anda dapat menentukan tipe variabel ini secara eksplisit tergantung pada jawaban @tony19

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

Artikel terkait