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 - 在联合内的不同类型中使用相同的字段名称的主要内容,如果未能解决你的问题,请参考以下文章