跳至主要内容

Promise 函数异步

要求任何返回 Promise 的函数或方法标记为 async。

🔧

此规则报告的一些问题可以通过 --fix ESLint 命令行选项 自动修复。

💭

此规则需要 类型信息 才能运行。

确保每个函数只能

  • 返回一个被拒绝的 promise,或者
  • 抛出一个 Error 对象。

相反,非 async、返回 Promise 的函数在技术上可以同时做到这两点。处理这些函数结果的代码通常需要处理这两种情况,这可能会变得很复杂。此规则的做法消除了创建代码来处理这两种情况的必要性。

当函数隐式地返回 Promise 和非 Promise 类型的联合时,通常是一个错误——此规则会标记这些情况。如果这是故意的,请明确返回类型以允许规则通过。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/promise-function-async": "error"
}
};

在游乐场中尝试此规则 ↗

示例

此规则的代码示例

const arrowFunctionReturnsPromise = () => Promise.resolve('value');

function functionReturnsPromise() {
return Promise.resolve('value');
}

function functionReturnsUnionWithPromiseImplicitly(p: boolean) {
return p ? 'value' : Promise.resolve('value');
}
在游乐场中打开

选项

此规则接受以下选项

type Options = [
{
/** Whether to consider `any` and `unknown` to be Promises. */
allowAny?: boolean;
/** Any extra names of classes or interfaces to be considered Promises. */
allowedPromiseNames?: string[];
checkArrowFunctions?: boolean;
checkFunctionDeclarations?: boolean;
checkFunctionExpressions?: boolean;
checkMethodDeclarations?: boolean;
},
];

const defaultOptions: Options = [
{
allowAny: true,
allowedPromiseNames: [],
checkArrowFunctions: true,
checkFunctionDeclarations: true,
checkFunctionExpressions: true,
checkMethodDeclarations: true,
},
];

allowAny

是否忽略返回 anyunknown 的函数。如果您想要额外的安全性,请考虑关闭此选项,因为它会降低规则捕获不正确 Promise 行为的能力。

带有 { "allowAny": false } 的代码示例

const returnsAny = () => ({}) as any;
在游乐场中打开

allowedPromiseNames

对于使用除全局内置 Promise 之外的构造来进行异步代码的项目。此选项允许指定导致函数也被检查的类或接口的字符串名称。

带有 { "allowedPromiseNames": ["Bluebird"] } 的代码示例

class Bluebird {}

const returnsBluebird = () => new Bluebird(() => {});
在游乐场中打开

checkArrowFunctions

是否检查箭头函数。默认情况下为 true,但可以设置为 false 以忽略它们。

checkFunctionDeclarations

是否检查独立函数声明。默认情况下为 true,但可以设置为 false 以忽略它们。

checkFunctionExpressions

是否检查内联函数表达式。默认情况下为 true,但可以设置为 false 以忽略它们。

checkMethodDeclarations

是否检查类和对象字面量上的方法,默认情况下为 true,但可以设置为 false 以忽略它们。

何时不使用它

此规则可能难以在使用始终需要函数为 async 的 API 的项目中启用。您可能考虑使用 ESLint 禁用注释 以及为这些特定情况在您的依赖项上提交问题,而不是完全禁用此规则。


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除

资源