如何在 GraphQL 模式中定义嵌套枚举类型

Posted

技术标签:

【中文标题】如何在 GraphQL 模式中定义嵌套枚举类型【英文标题】:How to define Nested enum type in GraphQL schema 【发布时间】:2022-01-03 16:41:41 【问题描述】:

我在 graphql 架构中定义了一个枚举,如下所示:

enum QueryType 
    NORMAL, RANGE, REGEX, WILDCARD

但是WILDCARD查询,可以进一步指定为STARTSWITH、ENDSWITH和CONTAINS,

那么我们可以在定义 Schema 的同时实现类似下面的效果

 enum QueryType 
        NORMAL, RANGE, REGEX, enum WILDCARD  STARTSWITH, ENDSWITH, CONTAINS
    

 enum QueryType 
            NORMAL, RANGE, REGEX, WILDCARD: WildCardType
        
   enum WildCardType  STARTSWITH, ENDSWITH, CONTAINS

【问题讨论】:

【参考方案1】:

GraphQL 模式中没有这样的嵌套枚举。您可以考虑使用具有单独枚举的两个单独字段对其进行建模。

enum QueryType 
    NORMAL ,RANGE , REGEX , WILDCARD


enum WildcardType 
    STARTSWITH , ENDSWITH ,CONTAINS

假设对象类型调用SearchQuery 需要包含这些信息。它的架构可能如下所示:

type SearchQuery 
    queryType : QueryType!
    wildcardType : WildcardType

wildcardType 是一个可选字段,仅当 queryType 为 WILDCARD 时才包含该值。否则,它应该为空。

或者,您也可以考虑使用interface 将其建模为更“多态”的样式。喜欢的东西:

interface SearchQuery 
  queryType: QueryType!


type WildCardQuery implements  SearchQuery 
    queryType: QueryType!
    wildcardType : WildcardType!


type NonWildCardQuery implements SearchQuery
    queryType: QueryType!

【讨论】:

谢谢@KenChan,我不能使用 WildCardQuery 类型和输入 NonWildCardQuery 作为字段的输入类型,如何将此类型转换为输入类型? 输入类型不支持接口。恐怕你现在必须对输入类型使用第一个选项,尽管@oneof (github.com/graphql/graphql-spec/pull/825) 的 RFC 正在进行中以实现输入的“多态”风格

以上是关于如何在 GraphQL 模式中定义嵌套枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

如果它们来自数据源,如何在 graphql 模式中表示枚举?

如何使用 graphql-tools 使用或解析枚举类型?

GraphQL SDL 枚举类型

如何在 GraphQL 中为键值定义枚举

如何让 GraphQL 枚举解析字符串

如何在graphql中获取所有枚举值