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

如何修复TypeScript错误TS2769:调用无匹配重载

修复Express + TypeScript中TS2769类型不兼容错误

在后端TypeScript控制器中执行npm run dev时遇到TS2769错误,提示createCurrentUser函数的返回类型与Express的RequestHandler不兼容——函数返回Promise<Response|undefined>,但RequestHandler要求返回void或Promise<void>。

错误详情如下:

No overload matches this call.
  The last overload gave the following error.
    Argument of type '(req: Request, res: Response) => Promise<express.Response<any, Record<string, any>> | undefined>' is not assignable to parameter of type 'RequestHandlerParams<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.
      Type '(req: Request, res: Response) => Promise<express.Response<any, Record<string, any>> | undefined>' is not assignable to type 'RequestHandler<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.
        Type 'Promise<Response<any, Record<string, any>> | undefined>' is not assignable to type 'void | Promise<void>'.
          Type 'Promise<Response<any, Record<string, any>> | undefined>' is not assignable to type 'Promise<void>'.
            Type 'Response<any, Record<string, any>> | undefined' is not assignable to type 'void'.
              Type 'Response<any, Record<string, any>>' is not assignable to type 'void'.

7 router.post("/", jwtCheck, MyUserController.createCurrentUser);
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  node_modules/@types/express-serve-static-core/index.d.ts:153:5
    153     <
            ~
    154         P = ParamsDictionary,
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ... 
    162         ...handlers: Array<RequestHandlerParams<P, ResBody, ReqBody, ReqQuery, LocalsObj>>
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    163     ): T;
        ~~~~~~~~~
    The last overload is declared here.

    at createTSError (/home/ben-willys/Desktop/nai-eats-app/backend/node_modules/ts-node/src/index.ts:859:12)
    at reportTSError (/home/ben-willys/Desktop/nai-eats-app/backend/node_modules/ts-node/src/index.ts:863:19)
    at getOutput (/home/ben-willys/Desktop/nai-eats-app/backend/node_modules/ts-node/src/index.ts:1077:36)
    at Object.compile (/home/ben-willys/Desktop/nai-eats-app/backend/node_modules/ts-node/src/index.ts:1433:41)
    at Module.m._compile (/home/ben-willys/Desktop/nai-eats-app/backend/node_modules/ts-node/src/index.ts:1617:30)
    at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
    at Object.require.extensions.<computed> [as .ts] (/home/ben-willys/Desktop/nai-eats-app/backend/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19) {
  diagnosticCodes: [ 2769 ]
}

相关代码

MyUserController.ts

import express, { Request, Response } from "express";
import User from "../models/user";

const createCurrentUser = async (req: Request, res: Response) => {
    // check if user exists
try {
    const { auth0Id } = req.body;
    const  existingUser = await User.findOne({ auth0Id });
    
    if (existingUser) {
        return res.status(200).send();
    }

    const newUser = new User(req.body);
    await newUser.save();

    res.status(201).json(newUser.toObject());
} catch (error) {
    console.log(error);
    res.status(500).json({ message: "Error creating user"});
}
};

export default { createCurrentUser, };

MyUserRoute.ts

import express from "express";
import MyUserController from "../controllers/MyUserController";
import { jwtCheck } from "../middleware/auth";

const router = express.Router();

router.post("/", jwtCheck, MyUserController.createCurrentUser);

export default router;

修复方案

修改createCurrentUser函数,去掉res对象的返回操作,并明确指定函数返回类型为Promise<void>:

import express, { Request, Response } from "express";
import User from "../models/user";

// 明确指定返回类型为Promise<void>
const createCurrentUser = async (req: Request, res: Response): Promise<void> => {
    // check if user exists
try {
    const { auth0Id } = req.body;
    const  existingUser = await User.findOne({ auth0Id });
    
    if (existingUser) {
        // 去掉return,直接调用res.send()
        res.status(200).send();
        // 可选:提前结束函数执行
        return;
    }

    const newUser = new User(req.body);
    await newUser.save();

    res.status(201).json(newUser.toObject());
} catch (error) {
    console.log(error);
    res.status(500).json({ message: "Error creating user"});
}
};

export default { createCurrentUser, };

原因说明

Express的RequestHandler类型要求异步处理函数返回void或Promise<void>。原代码中return res.status(200).send()会让Promise的resolve值为Response对象,导致类型不匹配。去掉return后,函数不会返回响应对象,Promise最终会resolve为undefined,符合Promise<void>的类型要求(void类型允许undefined)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:23:19