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

如何用TypeScript为Next.js端点添加类型定义?

为Next.js API端点添加类型定义,让请求自动识别返回类型

方法1:在API端点中定义返回类型并导出给前端使用

在你的API文件中,利用NextApiResponse的泛型参数明确返回数据类型,同时导出该类型供前端复用(可以直接复用Prisma等ORM生成的类型,无需手动写接口):

// pages/api/myEndpoint.ts
import type { NextApiRequest, NextApiResponse } from 'next'
import { PrismaClient } from '@prisma/client'

// 直接复用Prisma查询的返回类型,无需手动定义接口
type MyResponseData = Awaited<ReturnType<typeof prisma.yourModel.findMany>>

const getHandler = async (
  req: NextApiRequest,
  res: NextApiResponse<MyResponseData>, // 指定响应的泛型类型
  prisma: PrismaClient
) => {
  const data = await prisma.yourModel.findMany()
  res.status(200).json(data)
}

export default getHandler

// 导出类型给前端使用
export type { MyResponseData }

前端请求时,导入该类型并传递给axios.get的泛型参数:

import type { MyResponseData } from '../pages/api/myEndpoint'
import { useQuery } from '@tanstack/react-query'
import axios from 'axios'

const { data: myData } = useQuery(['myKey'], async () => {
  // 给axios指定返回数据类型
  const response = await axios.get<MyResponseData>('/api/myEndpoint')
  return response.data
})
// 此时myData的类型为 MyResponseData | undefined

方法2:使用API契约工具自动同步类型

如果项目规模较大,不想手动维护前后端类型同步,可以使用ts-rest这类工具:通过定义统一的API契约,自动生成前端请求函数和后端处理函数的类型,彻底避免重复定义。

方法3:App Router Route Handlers的类型提取(Next.js 13+)

如果你使用App Router的Route Handlers,可以直接从处理函数的返回值中提取类型:

// app/api/myEndpoint/route.ts
import { PrismaClient } from '@prisma/client'

export async function GET() {
  const prisma = new PrismaClient()
  const data = await prisma.yourModel.findMany()
  return Response.json(data)
}

// 从GET函数的返回值中提取响应数据类型
export type MyResponseData = Awaited<ReturnType<typeof GET>> extends Response<infer T> ? T : never

前端使用方式和方法1一致,导入MyResponseData并传递给axios即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:17:41