为何@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>,因此不会触发错误。
解决方法
- 统一返回类型标注:给
getUser2也添加显式返回类型,让规则对两个函数保持一致的检测严格度(注意需要类型断言匹配标注类型):
async function getUser2(userId: string): Promise<User> { const userRef = await getUsersCollection().doc(userId).get() return userRef.data() as User }
- 明确忽略Promise:如果确实不需要处理函数返回的Promise,可以用
void关键字明确告知ESLint你的意图:
void getUser('123');
- 调整规则配置:如果希望放宽检测标准,可以在ESLint配置中修改
no-floating-promises的选项,比如启用ignoreVoid(允许用void忽略Promise):
{ "@typescript-eslint/no-floating-promises": ["error", { "ignoreVoid": true }] }
内容的提问来源于stack exchange,提问作者Norbert Hüthmayr
相关产品推荐
相关产品推荐

