Next.js+Auth.js+Mongoose中高阶函数的正确返回类型定义问题
问题解决:控制器无返回值+TypeScript类型报错
1. 解决返回值为undefined的问题
你的高阶函数里没有返回控制器的执行结果,而且控制器是async函数(返回Promise),必须await它并返回,否则外层async函数会默认返回undefined:
修改withDBConnection的try块代码:
// 原代码 Controller(...args); // 修改后 return await Controller(...args);
这样外层函数会把控制器的异步执行结果返回出去,调用await getUser(user.email)时就能拿到正确的user值。
2. 修复TypeScript类型报错问题
原来的Controller类型用any过于模糊,需要给高阶函数加上泛型参数,让TypeScript能正确推断参数和返回值类型:
修改后的完整类型定义与高阶函数:
// 定义精确的控制器类型,支持泛型参数和返回值 type Controller<Args extends any[], Return> = (...args: Args) => Promise<Return>; export const withDBConnection = <Args extends any[], Return>( controller: Controller<Args, Return> ): ((...args: Args) => Promise<Return>) => { return async (...args: Args) => { try { await dbStartConnection(); return await controller(...args); } catch (error) { console.log("inside withDBConnection catch block"); console.log((error as AppError).message); // 建议重新抛出错误,让调用方可以捕获处理 throw error; } }; };
使用示例(TypeScript会自动推断类型,不再报参数错误):
// 假设Auth.find返回Document数组,类型会被自动推断 export const getUser = withDBConnection(async (email: string) => { const user = await Auth.find({ discordEmail: email }); console.log("getUser", user); return user; }); // 调用时类型完全匹配,isExist会被推断为Document[] const isExist = await getUser(user.email);
补充说明
- 重新抛出错误:原catch块仅打印错误但未传递给调用方,加上
throw error后,调用方可以通过try/catch处理数据库连接或控制器执行中的错误。 - 类型精确化:通过泛型参数约束,TypeScript能自动校验控制器的参数类型,并推断返回值类型,既解决了参数报错问题,也提升了代码的类型安全性。
内容的提问来源于stack exchange,提问作者Marya
相关产品推荐
相关产品推荐

