Next.js使用iron-session时getServerSideProps报licenses类型不兼容错误
问题原因
TypeScript 对 withSessionSsr 的返回类型做自动推导时,优先从未登录分支的返回值推导出 props 结构为 { admin: Admin, licenses?: undefined },后续正常登录分支返回 licenses: License[] 时,类型和推导结果不匹配,触发ts(2345)类型报错。
解决方案
无需修改 utils 目录下的session公共封装文件,调用 withSessionSsr 时显式传入当前页面对应的props泛型类型,覆盖TS的自动推导结果即可解决报错。
修改后代码
pages/license.tsx
// 替换成你项目中Admin、License类型的实际导入路径 import type { Admin } from '@/types/admin' import type { License } from '@/types/license' import { withSessionSsr } from '@/utils/withSession' // 显式定义当前页面服务端返回的props完整结构 type LicensePageProps = { admin: Admin licenses?: License[] } export const getServerSideProps = withSessionSsr<LicensePageProps>(async function ({ req, res }) { const admin = req.session.admin const licenses = await prisma.license.findMany() if (admin === undefined) { res.setHeader('location', '/admin') res.statusCode = 302 res.end() return { props: { admin: { isLoggedIn: false } as Admin, }, } } return { props: { admin, licenses }, } })
说明
withSessionSsr本身预留了泛型入参用于指定页面props类型,默认值为{ [key: string]: unknown },显式传入类型不会破坏公共封装的逻辑- 未登录分支触发302跳转时,页面不会实际接收渲染props,因此将
licenses设为可选类型即可满足TS校验要求;如果需要非可选类型,也可以在未登录分支的props中补充licenses: []作为默认值 - 后续页面如果需要返回其他自定义字段,只需要在对应页面的Props类型中补充对应字段的类型定义即可,不需要改动公共文件
内容的提问来源于stack exchange,提问作者deadcoder0904
相关产品推荐
相关产品推荐

