是否可以使用GraphQL输入类型的继承?
类似的东西(当然,这不适用于输入类型):
interface UserInputInterface {
firstName: String
lastName: String
}
input UserInput implements UserInputInterface {
password: String!
}
input UserChangesInput implements UserInputInterface {
id: ID!
password: String
}
不,规范不允许输入类型实现接口。而GraphQL类型系统一般不定义任何形式的继承。甚至接口也不能继承其他接口。故意限制规范以保持简单。这意味着您不得不跨输入类型重复字段。
也就是说,根据构建模式的方式,您可以构建某种类型的变换器,它根据一些元数据以编程方式附加公共字段,例如:指令。
更好的是,您可以通过合成来解决您的问题(始终记住composition over inheritance)。例如。
input Name {
firstName: String
lastName: String
}
input UserInput {
name: Name
password: String!
}
input UserChangesInput {
name: Name
id: ID!
password: String
}
客户端现在必须向对象发送更深层次的对象,但这对于避免大量重复块来说听起来并不是很重要。它实际上对客户端也有好处,因为它们现在可以具有用于构建名称的通用逻辑,而不管使用它们的查询/变异。
在这个例子中,它只有两个简单的字段,这种方法是一种矫枉过正,但总的来说 - 我会说这是要走的路。
从June2018 stable version of the GraphQL spec开始,输入对象类型可以扩展另一个输入对象类型:
输入对象类型扩展用于表示已从某些原始输入对象类型扩展的输入对象类型。
这不是继承本身;你只能扩展基类型,而不是基于它创建新类型:
extend input MyInput {
NewField: String
}
请注意,新类型没有名称;现有的MyInput
类型得到扩展。
JavaScript引用实现在implemented Input Object extensions(2018年6月)中有GraphQL.js v14,虽然目前还不清楚如何在没有出错的情况下实际使用pass the extended input fields to a query。
有关实际的类型继承,请参阅graphql-s2s library。