使用Prisma实现Repository模式时遭遇类型继承错误
Prisma 实现 Repository 模式的类型推导问题
我用 Prisma 写 Repository 模式时踩了个类型坑:调用带关联查询的方法时,返回类型没自动包含关联的字段。
代码示例
class PostModel { static async findMany(obj?: Prisma.PostFindManyArgs) { return await db.post.findMany(obj); } } // 注:类里定义的是 findMany,这里调用的是 findUnique,应为笔误,实际是想实现对应查询方法 await PostModel.findUnique({ where: { id: params.id, }, include: { author: true, } })
实际返回类型
Post | null
预期返回类型
Post & {author: Author} | null
我试着加泛型解决,但写法不对:
static async findMany<T extends Prisma.PostFindManyArgs>( obj: T ): Promise<Prisma.PrismaPromise<Prisma.Result<typeof db.post, T,'findMany'>>> { return await db.post.findMany(obj); }
正确解决方法
要让 Repository 的方法正确推导关联查询的返回类型,得用对 Prisma 的类型工具,调整泛型和返回值定义:
以 findUnique 为例(先把类里的方法补对):
class PostModel { static async findUnique<T extends Prisma.PostFindUniqueArgs>( args: T ): Promise<Prisma.Result<typeof db.post, T, 'findUnique'>> { return db.post.findUnique(args); } }
如果是 findMany,正确写法是:
class PostModel { static async findMany<T extends Prisma.PostFindManyArgs>( args?: T ): Promise<Prisma.Result<typeof db.post, T, 'findMany'>> { return db.post.findMany(args); } }
几点关键:
- 泛型
T要继承对应操作的 Prisma 参数类型,比如查询单个用PostFindUniqueArgs,查列表用PostFindManyArgs - 返回类型直接用
Prisma.Result,不用嵌套Prisma.PrismaPromise—— 因为await会自动解析 Promise,嵌套反而会导致类型不对 - Prisma 的
Result工具会根据你传入的参数(比如include)自动推导带关联字段的返回类型
内容的提问来源于stack exchange,提问作者THE BOCKSTERS
相关产品推荐
相关产品推荐

