Skip to content
← Back to rules

typescript/no-floating-promises 正しさ

This rule is turned on by default when type-aware linting is enabled.
💭 This rule requires type information.
An auto-fix is available for this rule.

何をするか

このルールは、型定義されたコードにおいて「浮遊する」Promise を禁止します。これは、その解決または失敗を処理するコードがない状態で作成された Promise です。

以下のいずれかの方法で処理されない、Promise 値を持つ式に対して、このルールは警告を出力します:

  • .then() に2つの引数を渡して呼び出す
  • .catch() に1つの引数を渡して呼び出す
  • await する
  • return する
  • void する

また、プロミスを含む配列が作成されても適切に処理されていない場合も報告します。この問題を解決する主な方法は、前述の手続きに従って処理する単一のプロミスを作成するために、プロミスの並行処理メソッドのいずれかを使用することです。これらのメソッドには以下が含まれます:

  • Promise.all()
  • Promise.allSettled()
  • Promise.any()
  • Promise.race()

なぜ問題なのか

浮遊するプロミスは、操作の順序が正しくない、プロミスの拒否が無視されるなど、いくつかの問題を引き起こす可能性があります。

このルールに対して誤りなコードの例:

ts
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);

このルールに対して正しいコードの例:

ts
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));

設定

このルールは以下のプロパティを持つ設定オブジェクトを受け入れます:

allowForKnownSafeCalls

type: array

default: []

特定の呼び出しを無視できるようにする。型や値の指定子として指定する。

allowForKnownSafeCalls[n]

type: string

特定の宣言に一致させるための型または値の指定子

以下の4種類の指定子に対応しています:

  1. 文字列指定子(非推奨):名前によるユニバーサルマッチ
json
"Promise"
  1. ファイル指定子:ローカルファイルで宣言された型/値にマッチ
json
{ "from": "file", "name": "MyType" }
{ "from": "file", "name": ["Type1", "Type2"] }
{ "from": "file", "name": "MyType", "path": "./types.ts" }
  1. ライブラリ指定子:TypeScript の組み込みライブラリ型にマッチ
json
{ "from": "lib", "name": "Promise" }
{ "from": "lib", "name": ["Promise", "PromiseLike"] }
  1. パッケージ指定子:npm パッケージからの型/値にマッチ
json
{ "from": "package", "name": "Observable", "package": "rxjs" }
{ "from": "package", "name": ["Observable", "Subject"], "package": "rxjs" }

allowForKnownSafePromises

type: array

default: []

特定のプロミス型を無視できるようにする。型や値の指定子として指定する。

allowForKnownSafePromises[n]

type: string

特定の宣言に一致させるための型または値の指定子

以下の4種類の指定子に対応しています:

  1. 文字列指定子(非推奨):名前によるユニバーサルマッチ
json
"Promise"
  1. ファイル指定子:ローカルファイルで宣言された型/値にマッチ
json
{ "from": "file", "name": "MyType" }
{ "from": "file", "name": ["Type1", "Type2"] }
{ "from": "file", "name": "MyType", "path": "./types.ts" }
  1. ライブラリ指定子:TypeScript の組み込みライブラリ型にマッチ
json
{ "from": "lib", "name": "Promise" }
{ "from": "lib", "name": ["Promise", "PromiseLike"] }
  1. パッケージ指定子:npm パッケージからの型/値にマッチ
json
{ "from": "package", "name": "Observable", "package": "rxjs" }
{ "from": "package", "name": ["Observable", "Subject"], "package": "rxjs" }

checkThenables

type: boolean

default: false

プロミスとは限らないが、.then が実装されているオブジェクト(thenable)をチェックする。

ignoreIIFE

type: boolean

default: false

即時実行関数式(IIFE)を無視する。

ignoreVoid

type: boolean

default: true

void 式として扱われるプロミスを無視する。

使用方法

このルールを設定ファイルまたは CLI で有効化するには、以下のように使用できます:

json
{
  "rules": {
    "typescript/no-floating-promises": "error"
  }
}
bash
oxlint --type-aware --deny typescript/no-floating-promises

参照