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

Next.js API路由处理函数中catch错误的正确类型标注是什么?

解决Next.js API路由中TypeScript catch错误类型标注问题

TypeScript 规定 catch 子句的错误变量只能标注为 any 或 unknown,这是因为 JavaScript 中抛出的错误可以是任意类型(不只是标准 Error 对象),所以你直接指定自定义的 ErrorMessage 类型会触发 ts(1196) 错误。下面是两种符合规范的处理方式:

推荐方案:使用unknown+类型守卫

这是 TypeScript 最佳实践,既能保留类型安全,又能正确处理错误:

  1. 将 catch 的错误变量类型设为 unknown
  2. 在 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:05:11