graphql - GraphQL 输入类型可以继承其他类型或接口(interface)吗?

标签 graphql

是否可以对 GraphQL 输入类型使用继承?

类似的东西(当然,这不适用于输入类型):

interface UserInputInterface {
  firstName: String
  lastName: String
}

input UserInput implements UserInputInterface {
  password: String!
}

input UserChangesInput implements UserInputInterface {
  id: ID!
  password: String
}

最佳答案

不,规范不允许输入类型实现接口(interface)。而且 GraphQL 类型系统通常不定义任何形式的继承(extends 关键字将字段添加到现有类型,而不是用于继承)。该规范被有意限制为保持简单。这意味着您将陷入跨输入类型重复字段的困境。

也就是说,根据您构建架构的方式,您可以构建某种类型转换器,根据某些元数据以编程方式附加公共(public)字段,例如指令。这是one such implementation .

更好的是,您也许能够通过组合来解决您的问题(始终牢记composition over inheritance)。 例如

input Name {
  firstName: String
  lastName: String
}

input UserInput {
  name: Name
  password: String!
}

input UserChangesInput {
  name: Name
  id: ID!
  password: String
}

客户端现在必须将对象发送到更深的级别,但这听起来并不是避免大重复 block 的代价。它实际上可能对客户端也有好处,因为他们现在可以拥有构建名称的通用逻辑,而不管使用它们的查询/突变如何。

在这个例子中,只有 2 个简单的字段,这种方法有点矫枉过正,但总的来说 - 我认为这是正确的方法。

关于graphql - GraphQL 输入类型可以继承其他类型或接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921137/

相关文章:

sql - GraphQL 会生成实际的 SQL 查询吗?

amazon-web-services - 使用 Amazon api 网关用 REST API 包装 graphQL(appsync)

node.js - Graphql apollo 服务器解析器参数类型

graphql - GraphQL 有哪些实际用例?什么时候应该选择 GraphQL 而不是 REST?

php - Laravel Lighthouse GraphQL - 在服务器端排序

graphql - 应该如何使用 GraphQL 突变来对列表中的项目重新排序并更新多个对象?

graphql - Shopify GraphQL 突变返回 "Parse error on\"gid\"(IDENTIFIER)"

javascript - 如何在模式中嵌套两个 graphQL 查询?

python - Graphene-Django 嵌套过滤器(中继)

graphql - 无法运行 prisma deploy : Error: Cluster undefined does not exist