【问题标题】:TypeGraphql and Prisma 2 type conflictsTypeGraphql 和 Prisma 2 类型冲突
【发布时间】: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 生成的类型,因此这两种类型相互冲突

标签: typescript graphql prisma typegraphql


【解决方案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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 2018-03-28
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多