9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ESLintの@typescript-eslint/no-misused-promisesで怒られた時の対処法

Last updated at Posted at 2022-11-13

React(TypeScript)にESLintを導入して、クリックイベントなどで非同期処理を入れた際に
@typescript-eslint/no-misused-promises
が現れました。

こちら、なぜこんな指摘が出るのかも含めて対処法を残します。

※こちらはTypescriptのESLintを導入してないケースでは注意されないと思います。

結論

◆Async/Await と .then() を使い分けよう

なぜ指摘されるのか?

例えばデータをフェッチしてくる下記コードをクリックイベントで実行しようとして
スクリーンショット 2022-11-13 19.08.27.png

ESLintが、{reload}の箇所で「ここはPromiseあかんで」と指摘します 
スクリーンショット 2022-11-13 19.11.16.png

なぜなら、
スクリーンショット 2022-11-13 19.22.56.png
イベントハンドラにはvoidを返す関数を入れるように定義されているから。

Promiseはあくまでプロミスを返しているため
ESLintのチェックに引っかかります。

Q.ではどうするか?

A. ならば.then()だ

スクリーンショット 2022-11-13 19.32.30.png
voidを返す形にすれば指摘も消えます。
それにこれくらいなら可読性の影響もないと判断しています。
スクリーンショット 2022-11-13 19.34.17.png

ちなみに.catch()のなかにalert()入れてる件は、今回は見逃してください。

いちおう関数コンポーネント内の定義なのでギリOKかと思いますが、
alert()を使うならこの関数ではstringを返して
クリックイベント関数の返り値をvoid型にするのが良い気がしています。

こちらのディスカッションでも討論されてましたが、void演算子をつける案やラッパーを作った方もいました。

まとめ

個人的には、サーバーレスを使うと相手の関数自体がPromiseを返すこともあるため、
可読性がいいからと、一つ覚えのAsync/Awaitにならず
状況に応して.then()を使える柔軟さを身に付けておいた方が良いと思いました。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?