You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何@typescript-eslint/no-floating-promises仅触发部分async函数报错?

为什么@typescript-eslint/no-floating-promises仅对部分async函数调用触发错误?

问题核心出在两个async函数的返回类型差异上,导致ESLint规则的检测行为不同:

  • 对于getUser:你显式标注了返回类型为Promise<User>,这相当于告诉TypeScript和ESLint:这个函数一定会返回一个包含User类型值的Promise,必须被妥善处理(比如用await、链式调用.then()/.catch(),或者赋值给变量后续处理)。当你直接调用它却不处理返回的Promise时,规则会立刻识别到这个未处理的Promise并触发错误。

  • 对于getUser2:你没有显式标注返回类型,TypeScript会自动推断其返回类型为Promise<User | undefined>——因为Firebase的DocumentSnapshot.data()方法默认返回T | undefined(当指定文档不存在时会返回undefined)。此时,@typescript-eslint/no-floating-promises规则的类型检查逻辑会认为,返回的Promise<User | undefined>如果被忽略,潜在风险低于明确的Promise<User>,因此不会触发错误。

解决方法

  1. 统一返回类型标注:给getUser2也添加显式返回类型,让规则对两个函数保持一致的检测严格度(注意需要类型断言匹配标注类型):
async function getUser2(userId: string): Promise<User> {
  const userRef = await getUsersCollection().doc(userId).get()
  return userRef.data() as User
}
  1. 明确忽略Promise:如果确实不需要处理函数返回的Promise,可以用void关键字明确告知ESLint你的意图:
void getUser('123');
  1. 调整规则配置:如果希望放宽检测标准,可以在ESLint配置中修改no-floating-promises的选项,比如启用ignoreVoid(允许用void忽略Promise):
{
  "@typescript-eslint/no-floating-promises": ["error", { "ignoreVoid": true }]
}

内容的提问来源于stack exchange,提问作者Norbert Hüthmayr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:15:58