如何让prisma-client-js为可选字段生成undefined而非null类型?
解决Prisma可选字段类型(null vs undefined)不兼容问题
Prisma 默认会将模型中的可选字段映射为类型 | null,这是因为 MongoDB 本身用null表示缺失值,但如果遇到外部类型要求类型 | undefined的情况,可以通过以下几种方式解决:
1. 自定义TypeScript类型转换
创建一个映射类型,把Prisma生成的类型中的null替换为undefined,无需修改Prisma的生成逻辑:
// 定义通用转换工具类型 type Undefinedify<T> = { [K in keyof T]: T[K] extends null | infer U ? U | undefined : T[K] }; // 基于Prisma生成的User类型,生成兼容undefined的版本 import { User as PrismaUser } from '@prisma/client'; export type User = Undefinedify<PrismaUser>;
之后直接使用这个自定义的User类型,就能和要求undefined的外部类型兼容。
2. 查询时手动转换null为undefined
在查询数据库后,将返回结果中的null字段手动替换为undefined,确保运行时和类型都匹配:
import { prisma } from './prisma-client'; async function getUserById(id: string) { const prismaUser = await prisma.user.findUnique({ where: { id } }); if (!prismaUser) return null; // 转换null为undefined return { ...prismaUser, name: prismaUser.name ?? undefined, surname: prismaUser.surname ?? undefined }; }
这个方法能保证返回的对象实际值是undefined,同时TypeScript会自动推导正确的类型。
3. 注意:Prisma暂无直接配置生成undefined的选项
目前Prisma没有提供配置项让可选字段直接生成类型 | undefined,因为其设计是对齐数据库的语义——MongoDB中缺失的字段查询后会被Prisma填充为null,所以生成的类型默认是null。如果需要兼容undefined,上述两种方法是最直接的解决方案。
内容的提问来源于stack exchange,提问作者InsalataCondita
相关产品推荐
相关产品推荐

