首页 > 解决方案 > TypeGraphql 和 Prisma 2 类型冲突

问题描述

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

我使用 Prisma 来检查我的数据库,然后从schema.prisma.

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

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

@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;
};

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

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

标签: typescriptgraphqlprismatypegraphql

解决方案


导入类型时,您可以使用as关键字(进行类型断言)并重命名其中一种类型。例如,您可以将CoursePrisma 重命名为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;
};

推荐阅读