graphql - 如何在 GraphQL 类型中引用特定的 ENUM 值?

标签 graphql graphql-js

我有以下架构:

enum PaymentTypeName {
  PAYMENT_CARD
  PAYMENT_CARD_TOKEN
}

interface Payment {
  id: ID!
  type: PaymentTypeName!
}

type PaymentCardPayment implements Payment {
  id: ID!
  type: PaymentTypeName!
  card: PaymentCard!
}

type PaymentCardTokenPayment implements Payment {
  id: ID!
  type: PaymentTypeName!
  card: PaymentCard!
}

PaymentPaymentCardPaymentPaymentCardTokenPayment时,由type的值决定,即它是PAYMENT_CARDPAYMENT_CARD_TOKEN

如何在界面中表示 PaymentCardPayment/PaymentCardTokenPayment 继承 PaymentTypeName 的特定值?

我尝试了以下各种组合:

type PaymentCardPayment implements Payment {
  id: ID!
  type: PaymentTypeName.PAYMENT_CARD!
  card: PaymentCard!
}

和:

type PaymentCardPayment implements Payment {
  id: ID!
  type: PaymentTypeName[PAYMENT_CARD]!
  card: PaymentCard!
}

但是所有这些都提示语法错误,并且我无法找到相关文档。

最佳答案

GraphQL 不支持您尝试执行的操作。如果字段的类型声明为 PaymentTypeName,并且 PAYMENT_CARDPAYMENT_CARD_TOKEN 都是 PaymentTypeName 的有效值,则它们还必须是该字段的有效值。无法采用现有类型(无论是枚举、标量还是对象类型)并有条件地从该类型已定义的可能值集中创建可能值的子集。

也就是说,如果 PaymentCardPayment.type 始终解析为 PAYMENT_CARD 并且 PaymentCardTokenPayment.type 始终解析为 PAYMENT_CARD_TOKEN code>,那么在这里使用枚举根本没有意义。事实上,在这种特定情况下,我们可以完全省略 type 字段。毕竟,在这种情况下,该字段的唯一目的是允许客户端区分 Payment 可能解析的可能类型。然而,GraphQL 已经为我们提供了 __typename字段通过解析为已解析类型的名称来完成此操作。

因此,在这个特定实例中,只需执行以下操作就足够了:

interface Payment {
  id: ID!
}

type PaymentCardPayment implements Payment {
  id: ID!
  card: PaymentCard!
}

type PaymentCardTokenPayment implements Payment {
  id: ID!
  card: PaymentCard!
}

并查询类型为Payment的字段,如下所示:

{
  payments {
    id
    __typename
    ... on PaymentCardPayment {
      card {
        # ...
      }
    }
    ... on PaymentCardTokenPayment {
      card {
        # ...
      }
    }
  }
}

关于graphql - 如何在 GraphQL 类型中引用特定的 ENUM 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44459115/

相关文章:

graphql - 紧跟查询类型后的字符串的意义(查询/变异)GraphQL

javascript - 使用函数生成器将值返回到 GraphQL Mutation 中的输出字段

graphql - 从缓存graphql apollo 2.0读取数据

GraphQL:是否可以搜索嵌套字段?

graphql - javascript "cannot add property" "object is not extensible"当我在 graphql 查询中更新缓存时

node.js - Apollo 服务器 : How can I add a custom endpoint for Stripe webhook?

node.js - 在 express GraphQL 中解析嵌套数据

node.js - NodeInterface 和 nodeField 在 relayjs 中是如何工作的,它们是什么意思

node.js - 当我在服务器端更新模式时,中继/GraphQL 模式缓存不更新

node.js - 单一查询不会返回嵌套数组