使用next-connect和next-iron-session时出现TypeScript重载匹配调用错误
问题根因
你遇到的报错是next-connect版本差异导致的:v1.x 版本重构了类型定义,不再支持直接给nc传入2个泛型参数,且默认实例不支持路径匹配,和你使用的旧版写法不兼容。
解决方法
方法1:降级到兼容的v0.x版本(最便捷)
v0.12.x是next-connect v0的最后稳定版本,完全支持你原有的写法,直接安装对应版本即可:
npm install next-connect@0.12.2 # 或者用yarn/pnpm pnpm add next-connect@0.12.2
安装后你原来的nc<NextIronRequest, NextApiResponse>写法、链式调用带路径的.get方法都不会再报类型错误。
方法2:适配v1.x版本的类型定义
如果要使用v1.x版本,按以下步骤修改:
- 扩展全局NextApiRequest类型(一劳永逸,无需自定义NextIronRequest)
在项目的next-env.d.ts或者自定义的types/index.d.ts文件中添加如下声明:
import type { Session } from 'next-iron-session' declare module 'next' { interface NextApiRequest { session: Session } }
- 调整handler创建写法,添加类型断言适配泛型:
import nc, { type NextConnect } from 'next-connect' import type { NextApiRequest, NextApiResponse } from 'next' const handler = nc({ onError: (err, _, res: NextApiResponse) => { console.error(err) res.status(500).end(err.toString()) }, }) as NextConnect<NextApiRequest, NextApiResponse>
- 如果你需要用到路径匹配功能,需要使用v1提供的路由增强:
import { nc } from 'next-connect/node' // 对应node运行时 import { withRouter } from 'next-connect/router' const handler = withRouter(nc({ onError: (err, _, res) => { console.error(err) res.status(500).end(err.toString()) } }))
修改后所有路由handler的req都会默认带session类型,链式调用的路径参数也不会报错。
内容的提问来源于stack exchange,提问作者deadcoder0904
相关产品推荐
相关产品推荐

