如何修复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
相关产品推荐
相关产品推荐

