Next.js API路由处理函数中catch错误的正确类型标注是什么?
解决Next.js API路由中TypeScript catch错误类型标注问题
TypeScript 规定 catch 子句的错误变量只能标注为 any 或 unknown,这是因为 JavaScript 中抛出的错误可以是任意类型(不只是标准 Error 对象),所以你直接指定自定义的 ErrorMessage 类型会触发 ts(1196) 错误。下面是两种符合规范的处理方式:
推荐方案:使用unknown+类型守卫
这是 TypeScript 最佳实践,既能保留类型安全,又能正确处理错误:
- 将 catch 的错误变量类型设为
unknown - 在 catch 块内通过类型判断,确认错误的结构后再访问
message属性
修改后的完整代码:
import { NextRequest, NextResponse } from "next/server"; import dbConnect from "@/lib/dbConnect"; import User from "@/models/User"; // 保留你的错误结构定义 interface ErrorMessage { message: string; } // 类型守卫函数,判断是否为符合结构的错误 function isErrorMessage(error: unknown): error is ErrorMessage { return ( typeof error === 'object' && error !== null && 'message' in error && typeof (error as ErrorMessage).message === 'string' ); } export async function GET(req: NextRequest, { params }: { params: { id: string } }) { await dbConnect(); const { id } = params; try { const user = await User.findById(id) return NextResponse.json({ success: true, data: user, }, { status: 200, }) } catch (error: unknown) { // 用类型守卫检查错误结构 const errorMessage = isErrorMessage(error) ? error.message : '获取用户失败'; return NextResponse.json({ success: false, message: errorMessage }, { status: 404, }) } }
简化方案:使用any(不推荐)
如果你暂时不需要严格的类型检查,可以直接将错误类型设为 any,但这会丢失 TypeScript 的类型安全保障:
catch (error: any) { return NextResponse.json({ success: false, message: error.message || '获取用户失败' }, { status: 404, }) }
内容的提问来源于stack exchange,提问作者in43sh
相关产品推荐
相关产品推荐

