我有以下架构:
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!
}
当Payment
是PaymentCardPayment
或PaymentCardTokenPayment
时,由type的值决定,即它是PAYMENT_CARD
或PAYMENT_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_CARD
和 PAYMENT_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/