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

在Express Handler函数中使用Async/Await触发TypeScript ESLint错误

Express异步Handler触发ESLint错误的问题解析

你的代码如下:

import { Handler } from 'express'

export const fooHandler: Handler = async (_req, res) => {
  await new Promise(resolve => setTimeout(resolve, 1000));
  res.send('');
};

触发的ESLint错误为:

Promise-returning function provided to variable where a void return was expected (eslint@typescript-eslint/no-misused-promises)

关于规则的说明

@typescript-eslint/no-misused-promises并非新增规则,但它的检测逻辑在后续版本中有所更新,尤其是对返回void类型的函数是否返回Promise的校验更严格了。

Express的Handler类型默认定义返回值为void,但异步函数本质上会返回Promise<void>,这就造成了类型不匹配。旧项目能正常运行,大概率是因为:

  • 旧项目使用的@typescript-eslint/eslint-plugin版本较低,当时该规则未对这种场景做严格检测;
  • 旧项目没有启用这个ESLint规则。

解决办法

有两种常见的处理方式:

  1. 明确指定返回类型
    给异步函数标注返回类型为Promise<void>,让类型定义和实际返回值匹配:

    import { Handler } from 'express'
    
    export const fooHandler: Handler = async (_req, res): Promise<void> => {
      await new Promise(resolve => setTimeout(resolve, 1000));
      res.send('');
    };
    
  2. 调整ESLint规则配置
    如果不想修改代码,可以在ESLint配置文件中放宽该规则对void返回值的检测:

    module.exports = {
      // 其他配置项...
      rules: {
        '@typescript-eslint/no-misused-promises': [
          'error',
          {
            checksVoidReturn: false
          }
        ]
      }
    };
    

    或者更精准地针对Express Handler场景配置,避免全局放宽:

    module.exports = {
      // 其他配置项...
      overrides: [
        {
          files: ['*.ts'],
          rules: {
            '@typescript-eslint/no-misused-promises': [
              'error',
              {
                checksVoidReturn: {
                  attributes: false
                }
              }
            ]
          }
        }
      ]
    };
    

内容的提问来源于stack exchange,提问作者akmalmzamri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:22