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

如何在Next.js路由处理器中为响应体指定类型?

问题描述

以下代码用于验证邮箱有效性,匹配成功则返回会员信息。我希望为响应体指定类型,实现类似代码中的效果——当success拼写错误时触发TypeScript错误提示,但目前直接用as DefaultResponse<User>的方式无效,请问该如何给Next.js路由处理器的响应体指定类型?

interface DefaultResponse<T> {
  success: boolean;
  message?: string;
  user?: T;
}

export async function POST(req: Request) {
  const body: Pick<User, 'email' | 'password'> = await req.json();

  const user = await prisma.user.findUnique({ where: { email: body.email } });

  if (!user) {
    return new Response(
      JSON.stringify({ message: 'email is invalid', success: false }),
    );
  }

  return new Response(
    JSON.stringify({ message: '', sueecss: true, user }),
  ) as DefaultResponse<User>; // 这种方式无效
}
解决方案

要让TypeScript检查响应体的JSON结构,核心是在序列化前就对数据做类型约束,而非给Response实例做无效的类型断言。具体实现方式如下:

1. 直接在构造响应数据时指定类型

在创建要序列化的JSON对象时,直接为其标注DefaultResponse<T>类型,TypeScript会实时检查属性拼写和类型:

interface DefaultResponse<T> {
  success: boolean;
  message?: string;
  user?: T;
}

export async function POST(req: Request) {
  const body: Pick<User, 'email' | 'password'> = await req.json();

  const user = await prisma.user.findUnique({ where: { email: body.email } });

  if (!user) {
    // 标注类型后,拼写或类型错误会立刻触发提示
    const responseData: DefaultResponse<User> = { 
      message: 'email is invalid', 
      success: false 
    };
    return new Response(JSON.stringify(responseData));
  }

  // 这里如果写成sueecss,TypeScript会直接报错
  const responseData: DefaultResponse<User> = { 
    message: '', 
    success: true, 
    user 
  };
  return new Response(JSON.stringify(responseData));
}

2. 进阶:封装响应生成函数(适用于多路由复用)

如果多个路由都需要使用统一的响应格式,可以封装一个函数,强制要求传入符合类型的数据:

interface DefaultResponse<T> {
  success: boolean;
  message?: string;
  user?: T;
}

function createApiResponse<T>(data: DefaultResponse<T>) {
  return new Response(JSON.stringify(data), {
    headers: { 'Content-Type': 'application/json' }
  });
}

export async function POST(req: Request) {
  const body: Pick<User, 'email' | 'password'> = await req.json();
  const user = await prisma.user.findUnique({ where: { email: body.email } });

  if (!user) {
    return createApiResponse<User>({ 
      message: 'email is invalid', 
      success: false 
    });
  }

  // 此处若拼写错误(如sueecss),TypeScript会直接抛出错误
  return createApiResponse<User>({ 
    message: '', 
    sueecss: true, // ❌ 报错:对象字面量只能指定已知属性,'sueecss'不在类型'DefaultResponse<User>'中
    user 
  });
}

通过以上方式,就能在编写响应数据时让TypeScript实时校验类型,包括属性拼写、类型匹配等问题,完全满足你的需求。

内容的提问来源于stack exchange,提问作者pvp11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:43:32