typescript 和 graphql-codegen 之间的枚举不匹配

问题描述 投票:0回答:3

我目前正在尝试解决以下问题,但还没有走得太远。目前,我正在运行 Apollo-Server 作为我的 graphQL 服务器,为 prisma2 配置了 postgres 数据库,并利用 graphql-codegen 从我的模式生成类型。目前,我正在尝试更新具有多对多关系的模型,并抛出非常奇怪的打字稿错误。我很确定我的更新不正确,但我看到的错误没有帮助。

以下是相关代码片段:

prisma.schema

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
}

最后是解析器中的违规代码:

updatePermission.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 和 generated/graphql 中看到的那样,两个枚举是相同的。不知道我在这里缺少什么。

任何帮助将不胜感激!谢谢

typescript graphql apollo-server prisma graphql-codegen
3个回答
10
投票

您还可以通过在

codegen.yml
中设置来告诉graphql-codegen将枚举创建为const(字符串联合):

config:
  enumsAsConst: true

0
投票

对于 2024 年提出这个问题的人来说,我刚刚遇到了同样的问题。我在我的项目中使用这个:

"prisma": "^5.9.1"

"@graphql-codegen/cli": "^5.0.2",

"typescript": "^5.3.3"

对我来说,实际有效的配置是

enumsAsTypes: true
不是
constEnums: true

这是我的配置:

import { type CodegenConfig } from '@graphql-codegen/cli'

const config: CodegenConfig = {
  overwrite: true,
  schema: ['./schema/**/types.graphql', './schema/**/queries.graphql', './schema/**/mutations.graphql'],
  documents: ['./api/queries/**/**.ts', './api/mutations/**/**.ts'],

  generates: {
    '../../../web/src/graphql/': {
      preset: 'client',
    },

    './schema.graphql': {
      plugins: ['schema-ast'],
    },

    './types/schema.ts': {
      plugins: ['typescript'],
      config: {
        enumsAsTypes: true,
      },
    },
  },
  hooks: { afterAllFileWrite: ['prettier --write'] },
}

export default config

-2
投票

prisma 枚举无法分配给 graphql 枚举..这就是问题

根据 graphql 的类型来转换返回值..

import { Permission  as PermissionQL  } from "../../generated/graphql";
...
return newPermission as PermissionQL;

这样我就解决了同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.