TypeGraphql 和 Prisma 2 类型冲突

Posted

技术标签:

【中文标题】TypeGraphql 和 Prisma 2 类型冲突【英文标题】:TypeGraphql and Prisma 2 type conflicts 【发布时间】:2021-01-20 18:51:36 【问题描述】:

我在带有 PostgreSQL 数据库的 Apollo Express 服务器上使用 TypeGraphql 和 Prisma 2。

我使用 Prisma 来检查我的数据库,然后从 schema.prisma 生成 TypeScript 类型。

我的 @ObjectType 模型类也使用 TypeGraphQL。

我的问题是我的 TypeGraphQL 类与 Prisma 生成的类型之间似乎遇到了类型冲突。例如,我有一个 TypeGraphQL Course 类,看起来像这样

@ObjectType()
export class Course 
  @Field(() => Int)
  id: number;

  @Field()
  title: string;
  .......

  @Field(() => User)
  creator: User;

并且 Prisma 生成一个如下所示的 Course 类型:

/**
 * Model Course
 */

export type Course = 
  id: number
  title: string
  .......
  creator_id: number

所以在我的自定义解析器中,当我尝试创建Course 时,我说突变返回Course 的类型。 (我有一个使用此服务的控制器,但该服务是问题所在)

export const createCourseService = async (
  prisma: PrismaClient,
  createCourseInput: CreateCourseInput,
  userId: number
): Promise<Course> => 
  let err, newCourse, foundUser;
  const  course, user  = prisma;

  .....

  [err, newCourse] = await to(
    course.create(
      data: 
        ...createCourseInput,
        creator: 
          connect:  id: userId ,
        ,
      ,
    )
  );
  return newCourse;
;

但是来自我的 TypeGraphQL 类的 Course 类型与 Prisma 生成的 Course 类型不同,但它们的名称相同,因此 TypeScript 有点认为它们是相同的,但给出并错误说创建者在 Course 类型中缺少,但在 Course 类型中需要。不太确定解决此问题的最佳方法是什么。

有什么方法可以将我的 TypeGraphQL 类和我的 Prisma 类型拼接在一起,或者以其他方式进行吗?

【问题讨论】:

一个类型可以有两个冲突的定义,只要你不在同一个文件中使用它们。在您声明 createCourseService 的文件中,确保从具有 Course 类的文件中导入 Course @LindaPaiste 这就是我正在做的事情。 Course 类被标记为 createCourseService 的返回类型,但 prisma.course.create() 返回的 Course 类型是 prisma 生成的类型,因此这两种类型相互冲突 【参考方案1】:

导入类型时,您可以使用as keyword(执行type assertion)并重命名其中一种类型。你可以例如将 Course 从 Prisma 重命名为 PrismaCourseDBCourseCourseModel 或您喜欢的任何其他名称。这是用于此的语法:

import  Course as DBCourse  from '@prisma/client'

然后,在您的解析器中,您可以拥有以下代码:

export const createCourseService = async (
  prisma: PrismaClient,
  createCourseInput: CreateCourseInput,
  userId: number
): Promise<DBCourse> => 
  let err, newCourse, foundUser;
  const  course, user  = prisma;

  .....

  [err, newCourse] = await to(
    course.create(
      data: 
        ...createCourseInput,
        creator: 
          connect:  id: userId ,
        ,
      ,
    )
  );
  return newCourse;
;

【讨论】:

以上是关于TypeGraphql 和 Prisma 2 类型冲突的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义类型的 TypeGraphql 字段和 Arg 装饰器

仅使用 typegraphql 中的类型名定义 arg 类型

prisma2 在 prisma 模式中设置长度和列类型

GraphQL 和 Prisma:当它们已经是 Prisma 数据库模式的一部分时,为啥要在应用程序模式中重新定义类型?

Prisma 2:未知 arg `where` 在 select.count.where 类型未定义

NestJS-Prisma,如何编写与 prisma 一对多类型匹配的 DTO