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
を参照してください。
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で開くconst promise = new Promise((resolve, reject) => resolve('value'));
await promise;
async function returnsPromise() {
return 'value';
}
void returnsPromise();
returnsPromise().then(
() => {},
() => {},
);
Promise.reject('value').catch(() => {});
await Promise.reject('value').finally(() => {});
await Promise.all([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で開く// promises can be marked as safe by using branded types
type SafePromise = Promise<number> & { __linterBrands?: string };
let promise: SafePromise = Promise.resolve(2);
promise;
function returnsSafePromise(): SafePromise {
return Promise.resolve(42);
}
returnsSafePromise();
Playgroundで開く使用しない場合
このルールは、多くの浮動するPromiseを設定する大規模な既存のプロジェクトで有効にするのが難しい場合があります。あるいは、グローバルな未処理のPromiseハンドラーが登録されているなど、浮動するPromiseや誤用されたPromiseによるクラッシュを心配していない場合は、場合によっては、このルールを使用しない方が安全な場合があります。このルールを完全に無効にする代わりに、void
やESLintの無効化コメントを特定の状況で使用することを検討してください。
関連ルール
参考資料
- "Promiseの使用" MDNドキュメント。特にPromiseの拒否イベントと合成に関するセクションを参照してください。
型チェックされたlintルールは従来のlintルールよりも強力ですが、型チェックされたlintingの設定も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスに関するトラブルシューティングを参照してください。