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) {
//...
}
