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.

它的作用

此规则禁止在 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: 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

type: array

default: []

允许忽略特定的 Promise 类型,指定为类型或值规范。

allowForKnownSafePromises[n]

type: 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" }

checkThenables

type: boolean

default: false

检查非严格意义上的 Promise 但具有 thenable 行为的对象。

ignoreIIFE

type: boolean

default: false

忽略立即执行的函数表达式(IIFEs)。

ignoreVoid

type: boolean

default: true

忽略作为 void 表达式的 Promise。

如何使用

要通过配置文件或 CLI 启用此规则,可以使用:

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

参考资料