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.
💡 A suggestion is available for this rule.

它的作用

此规则禁止 TypeScript 代码中的“悬空” Promise,即创建后没有任何代码处理其完成或拒绝的 Promise。

此规则会报告未以以下任一方式处理的、具有 Promise 值的语句:

  • 使用两个参数调用其 .then()
  • 使用一个参数调用其 .catch()
  • 对其 await
  • return
  • 对其使用 void

此规则还会报告创建了包含 Promise 的数组但未被正确处理的情况。解决此问题的主要方式是使用某个 Promise 并发方法创建一个单独的 Promise,然后按照上述流程对其进行处理。这些方法包括:

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

为什么这很糟糕?

悬空 Promise 会导致多种问题,例如操作顺序不正确、Promise 拒绝被忽略等。

示例

此规则的错误代码示例:

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: object | string

用于匹配特定声明的类型或值说明符

支持四种说明符类型:

  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" }
allowForKnownSafeCalls[n].from

type: "file"

必须为 "file"

allowForKnownSafeCalls[n].name

type: array | string

要匹配的类型或值名称

名称说明符可以是单个字符串或字符串数组

allowForKnownSafeCalls[n].name[n]

type: string

allowForKnownSafeCalls[n].path

type: string

可选文件路径,用于指定类型或值必须声明的位置。 如果省略,则会匹配所有文件。

allowForKnownSafePromises

type: array

default: []

允许忽略特定 Promise 类型,按类型或值说明符指定。

allowForKnownSafePromises[n]

type: object | string

用于匹配特定声明的类型或值说明符

支持四种说明符类型:

  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[n].from

type: "file"

必须为 "file"

allowForKnownSafePromises[n].name

type: array | string

要匹配的类型或值名称

名称说明符可以是单个字符串或字符串数组

allowForKnownSafePromises[n].name[n]

type: string

allowForKnownSafePromises[n].path

type: string

可选文件路径,用于指定类型或值必须声明的位置。 如果省略,则会匹配所有文件。

checkThenables

type: boolean

default: false

检查不一定是 Promise 的 thenable 对象。

ignoreIIFE

type: boolean

default: false

忽略立即调用函数表达式(IIFE)。

ignoreVoid

type: boolean

default: true

忽略作为 void 表达式的 Promise。

如何使用

To enable this rule using the config file or in the CLI, you can use:

json
{
  "options": {
    "typeAware": true
  },
  "rules": {
    "typescript/no-floating-promises": "error"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  options: { typeAware: true },
  rules: {
    "typescript/no-floating-promises": "error",
  },
});
bash
oxlint --type-aware --deny typescript/no-floating-promises

版本

此规则在 v1.11.0 中新增。

参考资料