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 重命名为 PrismaCourse
、DBCourse
或 CourseModel
或您喜欢的任何其他名称。这是用于此的语法:
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 类型
GraphQL 和 Prisma:当它们已经是 Prisma 数据库模式的一部分时,为啥要在应用程序模式中重新定义类型?