![](/img/trans.png)
[英]How do I implement GraphQL resolvers in Typescript with Graphql-codegen?
[英]Enum mismatch between typescript and graphql-codegen
我目前正试图解决以下问题,并没有走得太远。 目前,我正在运行 Apollo-Server 作为我的 graphQL 服务器,prisma2 配置了 postgres 数据库,并且正在利用 graphql-codegen 从我的模式生成类型。 目前,我正在尝试更新一个具有多对多关系的模型,并且会抛出非常奇怪的打字稿错误。 我很确定我做的更新不正确,但我看到的错误没有帮助。
以下是相关的代码片段:
棱镜模式
model Permission {
id Int @id @default(autoincrement())
verb PermissionVerb
resource PermissionModel
own Boolean @default(true)
roles Role[]
}
model Role {
id Int @id @default(autoincrement())
name String
permissions Permission[]
}
enum PermissionModel {
USER
ORDER
CUSTOMER
PERMISSION
ROLE
}
enum PermissionVerb {
CREATE
READ
UPDATE
DELETE
}
权限.gql
extend type Mutation {
updatePermission(input: UpdatePermissionInput): PermissionResult!
}
union PermissionResult = Permission | PermRoleNotFoundError
type Permission {
id: Int!
own: Boolean
resource: PermissionModel!
verb: PermissionVerb!
roles: [Role]
}
type Role {
id: Int!
name: String!
permissions: [Permission]
}
type PermRoleNotFoundError {
message: String!
}
enum PermissionModel {
USER
ORDER
CUSTOMER
PERMISSION
ROLE
}
enum PermissionVerb {
CREATE
READ
UPDATE
DELETE
}
最后是解析器中的违规代码:
更新权限.ts
export const updatePermission: Resolver<
ResolversTypes['UpdatePermissionInput'],
{},
Context,
RequireFields<MutationUpdatePermissionArgs, never>
> = async (_parent, args, context, _info) => {
const { id, verb, resource, own } = args.input
const oldPermission = await context.prisma.permission.findFirst({
where: { id },
include: { roles: true }
})
const newPermission = await context.prisma.permission.update({
where: { id },
data: {
id: oldPermission.id,
verb: verb ? verb : oldPermission.verb,
resource: resource ? resource : oldPermission.resource,
own: own ? own : oldPermission.own,
},
})
return newPermission
}
我收到以下打字稿警告:
Type '(_parent: {}, args: RequireFields<MutationUpdatePermissionArgs, never>, context: Context, _info: GraphQLResolveInfo) => Promise<...>' is not assignable to type 'Resolver<UpdatePermissionInput, {}, Context, RequireFields<MutationUpdatePermissionArgs, never>>'.
Type '(_parent: {}, args: RequireFields<MutationUpdatePermissionArgs, never>, context: Context, _info: GraphQLResolveInfo) => Promise<...>' is not assignable to type 'ResolverFn<UpdatePermissionInput, {}, Context, RequireFields<MutationUpdatePermissionArgs, never>>'.
Type 'Promise<Permission>' is not assignable to type 'UpdatePermissionInput | Promise<UpdatePermissionInput>'.
Type 'Promise<Permission>' is not assignable to type 'Promise<UpdatePermissionInput>'.
Type 'Permission' is not assignable to type 'UpdatePermissionInput'.
Types of property 'verb' are incompatible.
Type 'import(\"/Users/jrichardson/Documents/Projects/wsw/node_modules/.prisma/client/index\").PermissionVerb' is not assignable to type 'import(\"/Users/jrichardson/Documents/Projects/wsw/backend/src/generated/graphql\").PermissionVerb'.
Type '\"CREATE\"' is not assignable to type 'PermissionVerb'.
我不明白为什么它认为 PermissionVerb 不可分配 - 从我从 .prisma/client/index 和生成的/graphql 中可以看到,两个枚举是相同的。 不确定我在这里缺少什么。
任何帮助将不胜感激! 谢谢
棱镜枚举不可分配给graphql枚举..这就是问题
按graphql的类型转换返回..
import { Permission as PermissionQL } from "../../generated/graphql";
...
return newPermission as PermissionQL;
这样我就解决了同样的问题。
您还可以通过在codegen.yml
设置来告诉 graphql-codegen 将枚举创建为 const(字符串联合):
config:
enumsAsConst: true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.