Interface 扩展了 GraphQL Schema 中的多个接口

adn*_*kic 5 inheritance multiple-inheritance graphql

在 GraphQL 中,一个接口是否可以扩展多个其他接口?
我需要这样的东西:

interface A
{
   valueA: String
}

interface B
{
   valueB: String
}

interface C extend interface A & B
{
   valueA: String
   valueB: String
}

type D implements C{
   valueA: String
   valueB: String
}

Run Code Online (Sandbox Code Playgroud)

提供的解决方案是否可以在GraphQL中实现多个接口?指一种类型实现多个接口,而不是一种接口扩展多个接口

Tra*_*ato 6

当被问到这个问题时,答案是“否”,接口不可能扩展(或实现)其他接口

今天这个问题的答案是肯定的,接口可以实现其他接口,但该功能尚未在任何开源 GraphQL 服务器中实现

允许接口实现其他接口的 RFC于2020 年 1 月 10 日合并。该规范的 graphql-js 实现于 2019 年 10 月 8 日合并,但尚未发布(最终将作为 graphql-js@ 发布) 15.0.0)。


对于某些用例,可以通过实现多个接口的类型来模拟此功能。例如,考虑以下架构:

interface Node {
  id: ID!
}

# Ideally we'd like to write `interface Pet implements Node`
# but that's not possible (yet)
interface Pet {
  id: ID!
  name: String!
}

type Cat implements Node, Pet {
  id: ID!
  name: String!
  prefersWetFood: Boolean!
}
Run Code Online (Sandbox Code Playgroud)

然后我们就可以实际编写查询了

query {
  node(id: "sylviathecat") {
    ... on Pet {
      name
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

只要存在至少一个Pet也实现该查询的实现Node(事实上,该Pet接口实际上根本不需要具有该id: ID!字段),这就是一个有效的查询。