Bagaimana cara mendeklarasikan tipe dalam rantai janji panah gemuk?

Saya cukup baru dalam sintaksis TypeScript. Bekerja pada kode yang ada seperti ini:

private checkUsername(username: FormControl): boolean {
  return this.userService
    .findUser(username.value)
    .catch(error => this.displayError(error));
}

linter TypeScript memperingatkan bahwa Parameter error secara implisit bertipe any. Cukup adil, tetapi ketika saya mencoba menambahkan apa yang menurut saya tampak seperti deklarasi tipe di dalam panah gemuk:

.catch(error:any => this.displayError(error));

linter memperingatkan bahwa ia mengharapkan , menggantikan :.

Saya dapat mengatasi kesalahan dengan membungkus parameter dan mengetik deklarasi dalam tanda kurung:

.catch((error:any) => this.displayError(error));

Apakah ini karena ia mengharapkan daftar parameter singkatan dengan sintaks sebelumnya (karena itu tanda kurung wajib ketika mendeklarasikan informasi tipe dengan cara ini)?

(Baik Apa arti =› di TypeScript? (Fat Arrow) atau Apa itu arti =› (panah yang dibentuk dari sama dengan & lebih besar dari) dalam JavaScript? sangat berguna.)


person msanford    schedule 23.09.2016    source sumber
comment
Ini tidak ada hubungannya dengan janji, bukan? Saya tidak yakin mengapa ada tag atau kata di judulnya...   -  person Heretic Monkey    schedule 23.09.2016
comment
@MikeMcCaughan Karena saya belum pernah melakukan ini sebelumnya, saya tidak tahu pasti apakah ini ada hubungannya dengan berada dalam rantai janji. Jika tidak, itu informasi yang berguna. Terima kasih.   -  person msanford    schedule 23.09.2016


Jawaban (3)


Anda dapat menggunakan salah satu dari ini di TypeScript:

.catch(error => this.displayError(error));

or

.catch((error: any) => this.displayError(error));

Namun ini tidak valid:

.catch(error: any => this.displayError(error));

Itu hanya aturan sintaksis TypeScript.

Namun, ada singkatan untuk apa yang Anda coba lakukan:

.catch(this.displayError);

Jauh lebih sederhana!

person James Monger    schedule 23.09.2016
comment
Tentu saja, kenapa aku tidak memikirkan hal itu! Saya mulai berpikir untuk menambahkan tipe ke segala sesuatu, di mana pun, meskipun tipe tersebut jelas masih dapat ditangkap dengan metode terakhir. - person msanford; 23.09.2016
comment
Perhatikan bahwa steno tidak lengkap dan akan rusak jika displayError mengacu pada this. Maka Anda perlu .catch(this.displayError.bind(this)) - person artem; 24.09.2016

Anda perlu membungkus pasangan name:type dengan tanda kurung, jika tidak, parser tidak tahu apa yang harus dilakukan dengannya. Hal ini biasa terjadi, karena fungsi panah juga memerlukan tanda kurung jika fungsi tersebut memiliki lebih dari satu parameter atau sesuatu yang lebih kompleks daripada sekadar foo => bar.

Karena sintaks foo : bar dapat muncul di beberapa tempat lain (ternary, literal objek, dan label), hal ini sangat penting untuk memperjelasnya.

person ssube    schedule 23.09.2016

Anda memiliki sintaks yang benar.

Di ES6 kedua fungsi panah ini setara, sama;

.catch(error => this.displayError(error));

Dan

.catch((error) => this.displayError(error));

Yang pertama adalah singkatan yang hanya diperbolehkan bila Anda memiliki parameter SATU yang tepat.

Dengan TypeScript, jika Anda menambahkan dekorasi tipe -- Anda harus menggunakan formulir kedua dengan tanda kurung.

person Martin    schedule 23.09.2016
comment
Bertahun-tahun kemudian, saya masih menghabiskan setengah dari komentar saya di Stack Overflow untuk menyebutkan hal ini kepada orang-orang. - person msanford; 23.03.2018