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

如何修复Next.js TypeScript API路由中的'params is not a valid type'错误?

解决Next.js App Router PATCH路由部署到Vercel的类型错误

问题描述

部署项目到Vercel时收到如下类型错误,本地开发环境无报错且运行正常:

app/api/invoice/markAsPaid/[invoiceId]/route.ts
Type error: Route "app/api/invoice/markAsPaid/[invoiceId]/route.ts" has an invalid "PATCH" export:
Type "{ params: { invoiceId: string; }; }" is not a valid type for the function's second argument

相关代码:

"use server";

import { NextRequest, NextResponse } from "next/server";
import prisma from "@/app/utils/db";
import { requireUser } from "@/app/utils/hooks";

// PATCH function to mark invoice as PAID
export async function PATCH(
  request: NextRequest,
  context: { params: { invoiceId: string } } // Typing context correctly
) {
  // @ts-ignore: Ignore TypeScript error for params typing
  const { invoiceId } = context.params;  // Get the invoiceId from the context params

  try {
    const session = await requireUser();
    if (!session?.user?.id) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
    }

    // Update the invoice status to "PAID"
    const updatedInvoice = await prisma.invoice.update({
      where: { id: invoiceId },
      data: { status: "PAID" },
    });

    return NextResponse.json({ success: true, invoice: updatedInvoice });
  } catch (error: any) {
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}

问题原因

本地开发时用@ts-ignore掩盖了类型不匹配的问题,而Vercel构建时的TypeScript检查更严格。自定义的context类型不符合Next.js App Router路由处理函数的官方类型定义,导致部署时类型校验失败。

解决方案

步骤1:导入官方参数类型

从next/server导入Params类型,用它来规范路由参数的类型定义。

步骤2:修正上下文类型并移除忽略注释

替换自定义的context类型,移除@ts-ignore注释,确保类型完全匹配官方规范。

修改后的完整代码

"use server";

import { NextRequest, NextResponse, type Params } from "next/server";
import prisma from "@/app/utils/db";
import { requireUser } from "@/app/utils/hooks";

export async function PATCH(
  request: NextRequest,
  { params }: { params: Params<{ invoiceId: string }> }
) {
  const { invoiceId } = params;

  try {
    const session = await requireUser();
    if (!session?.user?.id) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
    }

    const updatedInvoice = await prisma.invoice.update({
      where: { id: invoiceId },
      data: { status: "PAID" },
    });

    return NextResponse.json({ success: true, invoice: updatedInvoice });
  } catch (error: any) {
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}

额外检查

确保本地开发依赖的Next.js版本与Vercel部署环境使用的版本一致,避免因版本差异导致的类型定义不一致问题。

内容的提问来源于stack exchange,提问作者Syed Laeeq Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:35:02