GraphQL - 在联合内的不同类型中使用相同的字段名称

Posted

技术标签:

【中文标题】GraphQL - 在联合内的不同类型中使用相同的字段名称【英文标题】:GraphQL - Using same field names in different types within union 【发布时间】:2017-10-25 12:28:03 【问题描述】:

如果我有这样的联合类型:

union AllOnboardingQuestionTypes = StepFinal | TimeRangesQuestion | PercentQuestion | SingleSelectQuestion | MultiSelectQuestion | InformationOnly

如果某些类型具有相同的字段名称但类型不同(例如,PercentAnswer 的答案是 float 而 SingleSelect 的答案是 string),这是进行查询的正确方法吗?

query OnboardingQuestionsQuery 
     onboardingQuestions 
       ... on InformationOnly 
         title
         description
         questionID
         inputType
       
       ... on StepFinal 
          title
          description
       
       ... on TimeRangesQuestion 
          title
          description
          timePeriods 
            timePeriod
            estimatedEnd
            estimatedStart
          
       
       ... on SingleSelectQuestion 
         title
         description
         questionID
         inputType
         singleSelectAnswer: answer
         singleSelectOptions: options 
           value
           label
         
       
       ... on MultiSelectQuestion 
         title
         description
         questionID
         inputType
         multiSelectAnswer: answer
         multiSelectOptions: options
       
       ... on PercentQuestion 
         title
         description
         questionID
         inputType
         percentAnswer: answer
         min
         max
       
    

别名对我来说似乎很麻烦,并且会使事情变得棘手,因为我必须在变异数据时处理别名 我希望我可以只使用answer 而不是singleSelectAnswer

但是当我尝试这样做时,我得到了这个错误:

"errors":["message":"Fields \"answer\" conflict because they return conflicting types String! and [Boolean!]!. Use different aliases on the fields to fetch both if this was intentional.","locations":["line":64,"column":7,"line":69,"column":7],"message":"Fields \"answer\" conflict because they return conflicting types String! and Float!. Use different aliases on the fields to fetch both if this was intentional.","locations":["line":64,"column":7,"line":74,"column":7],"message":"Fields \"answer\" conflict because they return conflicting types [Boolean!]! and Float!. Use different aliases on the fields to fetch both if this was intentional.","locations":["line":69,"column":7,"line":74,"column":7]]

我是 GraphQL 新手,不知道这是否是处理它的正确方法。在我的脑海中,我希望遵循多态性方法,但也许这不是它的完成方式。

【问题讨论】:

不确定它在这里会有多大帮助...但我注意到Union Types 文档对任何联合类型在解析器中具有__resolveType 字段的要求缺乏明确性:> 当您如果架构中有一个返回联合或接口类型的字段,则需要在解析器映射中指定一个额外的 __resolveType 字段,该字段告诉 GraphQL 执行器结果是哪种类型,在可用选项中。通过:ApolloGraphQL 【参考方案1】:

这是进行查询的正确方法吗?

是的。根据当前(2018 年 6 月)GraphQL specification,以这种方式限制工会。另请参阅graphql.js 上的相应问题

别名看起来很麻烦

避免这种情况的最佳方法是当返回类型不同时,架构指定不同的字段名称。

【讨论】:

天哪,规范的愚蠢之处,如果联合类型可以在哪些字段中出现变化,为什么不允许字段类型在对象类型之间变化?【参考方案2】:

我遇到了同样的问题,并找到了三种不同的解决方案:

    使用界面 使用联合 使用带有附加类型信息的字符串

一切都不是很好,但工作。我在 Github 上放了一个包含所有解决方案的简单示例项目:https://github.com/chnoack/apollo-dynamic-types-example

【讨论】:

以上是关于GraphQL - 在联合内的不同类型中使用相同的字段名称的主要内容,如果未能解决你的问题,请参考以下文章

了解 GraphQL 联合类型

GraphQL 联合和输入类型?

联合类型导致 graphql 订阅

使用 graphql-ruby 实现联合类型

如何使用 GraphQL 和 ApolloStack 解析联合/接口字段

GraphQL 枚举联合解决方法?