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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:00:53