本文へ移動

no-floating-promises

Promiseライクなステートメントを適切に処理することを要求します。

拡張 "plugin:@typescript-eslint/recommended-type-checked" ESLint設定 に追加すると、このルールが有効になります。

💡

このルールによって報告される問題の一部は、エディターの 提案.

によって手動で修正できます。

このルールには 型情報 が必要です。

「浮動する」Promiseとは、エラーが発生した場合にそれを処理するコードが設定されていないPromiseのことです。浮動するPromiseは、操作のシーケンスが不適切になる、Promiseの拒否が無視されるなど、いくつかの問題を引き起こす可能性があります。

このルールは、Promiseが作成され、適切に処理されていない場合に報告します。Promise値のステートメントを処理する有効な方法には、次のものがあります。

  • await を使用して待機する
  • return で返す
  • void を使用して無視する
  • 2つの引数を使用して .then() を呼び出す
  • 1つの引数を使用して .catch() を呼び出す

このルールは、Promiseを含む配列が作成され、適切に処理されていない場合にも報告します。これを解決する主な方法は、Promiseの同時実行メソッドのいずれかを使用して単一のPromiseを作成し、上記の procedureに従ってそれを処理することです。これらのメソッドには、次のものがあります。

  • Promise.all()
  • Promise.allSettled()
  • Promise.any()
  • Promise.race()
ヒント

no-floating-promises は、未処理のPromise *ステートメント* だけを検出します。if文などの*論理的な*場所にPromiseを提供するコードを検出するには、no-misused-promises を参照してください。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-floating-promises": "error"
}
};

Playgroundでこのルールを試してみてください ↗

const promise = new Promise((resolve, reject) => resolve('value'));
promise;

async function returnsPromise() {
return 'value';
}
returnsPromise().then(() => {});

Promise.reject('value').catch();

Promise.reject('value').finally();

[1, 2, 3].map(async x => x + 1);
Playgroundで開く

オプション

このルールは、以下のオプションを受け入れます。

type Options = [
{
allowForKnownSafePromises?: (
| {
from: 'file';
name: [string, ...string[]] | string;
path?: string;
}
| {
from: 'lib';
name: [string, ...string[]] | string;
}
| {
from: 'package';
name: [string, ...string[]] | string;
package: string;
}
| string
)[];
/** Whether to ignore async IIFEs (Immediately Invoked Function Expressions). */
ignoreIIFE?: boolean;
/** Whether to ignore `void` expressions. */
ignoreVoid?: boolean;
},
];

const defaultOptions: Options = [
{ ignoreVoid: true, ignoreIIFE: false, allowForKnownSafePromises: [] },
];

ignoreVoid

このオプションは、デフォルトでtrueであり、void演算子を使用して消費されたPromiseの報告を停止できます。これは、Promiseを意図的に待機しないことを明示的にマークする良い方法です。

{ ignoreVoid: true } を使用したこのルールの**正しい**コードの例

async function returnsPromise() {
return 'value';
}
void returnsPromise();

void Promise.reject('value');
Playgroundで開く

このオプションをtrueに設定し、no-voidを使用している場合は、allowAsStatement オプションも有効にする必要があります。

ignoreIIFE

これにより、非同期IIFE(すぐに実行される関数式)のチェックをスキップできます。

{ ignoreIIFE: true } を使用したこのルールの**正しい**コードの例

await (async function () {
await res(1);
})();

(async function () {
await res(1);
})();
Playgroundで開く

allowForKnownSafePromises

このオプションを使用すると、特定の型を「安全な」浮動型としてマークできます。たとえば、APIがPromiseを返し、その拒否がライブラリによって安全に処理されるライブラリの場合に、これを行う必要がある場合があります。

このオプションは、安全と見なす型指定子の配列を受け取ります。配列内の各項目は、次の形式のいずれかである必要があります。

  • ファイルで定義された型(プロジェクトルートディレクトリからの相対パスであるpathをオプションとする{ from: "file", name: "Foo", path: "src/foo-file.ts" }
  • デフォルトライブラリの型({ from: "lib", name: "PromiseLike" }
  • パッケージからの型({ from: "package", name: "Foo", package: "foo-lib" }。これは、型定義パッケージの型にも機能します)。

このルールを使用したコードの例

{
"allowForKnownSafePromises": [
{ "from": "file", "name": "SafePromise" },
{ "from": "lib", "name": "PromiseLike" },
{ "from": "package", "name": "Bar", "package": "bar-lib" }
]
}
let promise: Promise<number> = Promise.resolve(2);
promise;

function returnsPromise(): Promise<number> {
return Promise.resolve(42);
}

returnsPromise();
Playgroundで開く

使用しない場合

このルールは、多くの浮動するPromiseを設定する大規模な既存のプロジェクトで有効にするのが難しい場合があります。あるいは、グローバルな未処理のPromiseハンドラーが登録されているなど、浮動するPromiseや誤用されたPromiseによるクラッシュを心配していない場合は、場合によっては、このルールを使用しない方が安全な場合があります。このルールを完全に無効にする代わりに、voidESLintの無効化コメントを特定の状況で使用することを検討してください。

参考資料


型チェックされたlintルールは従来のlintルールよりも強力ですが、型チェックされたlintingの設定も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスに関するトラブルシューティングを参照してください。

リソース