是否可以在 GraphQL 中实现多个接口?

Posted

技术标签:

【中文标题】是否可以在 GraphQL 中实现多个接口?【英文标题】:Is it possible to implement multiple interfaces in GraphQL? 【发布时间】:2017-12-26 21:30:01 【问题描述】:

是否可以在 GraphQL 模式中指定实现多个接口的类型?如果是这样,这将如何实现?

【问题讨论】:

【参考方案1】:

是的。如spec中所述:

一个对象类型可以声明它实现了一个或多个独特的接口。

请记住,生成的对象必须是“它实现的所有接口的超集”——它必须实现每个接口具有的所有字段,并且这些字段不能冲突。例如,如果接口 A 和接口 B 都有一个名为 something 的字段,则该字段的类型对于两个接口必须相同,以便对象类型实现这两个接口。

这是一个简单的例子,你可以open in CodeSandbox 玩玩。

注意:正如其他人指出的那样,不再支持使用逗号分隔接口 - 请改用 &(与号)。

const  ApolloServer, gql  = require("apollo-server");

const typeDefs = gql`
  type Query 
    someAnimal: Animal!
    someBird: Bird!
  

  interface Bird 
    wingspan: Int!
  

  interface Animal 
    speed: Int!
  

  type Swallow implements Animal & Bird 
    wingspan: Int!
    speed: Int!
  
`;

const resolvers = 
  Query: 
    someAnimal: (root, args, context) => 
      return  wingspan: 7, speed: 24 ;
    ,
    someBird: (root, args, context) => 
      return  wingspan: 6, speed: 25 ;
    
  ,
  Bird: 
    __resolveType: () => "Swallow"
  ,
  Animal: 
    __resolveType: () => "Swallow"
  
;

const server = new ApolloServer(
  typeDefs,
  resolvers
);

server.listen().then(( url ) => 
  console.log(`? Server ready at $url`);
);

请注意,该规范现在还允许interfaces to implement other interfaces。

当定义实现另一个接口的接口时,实现接口必须定义由实现接口指定的每个字段...传递实现的接口(由正在实现的接口实现的接口)也必须在实现上定义类型或接口。

在 GraphQL.js 中,从 15.0.0 版开始支持此功能。

【讨论】:

根据最新版本的规范(graphql.github.io/graphql-spec/draft/#sec-Interfaces):“类型也可以实现多个接口。例如,Business 实现了示例中的NamedEntityValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity 【参考方案2】:

似乎逗号分隔接口不再起作用。我不得不使用“&”来让它工作(阿波罗),看到这个答案https://***.com/a/49521662/1959584

type Something implements First & Second

【讨论】:

根据最新版本的规范(graphql.github.io/graphql-spec/draft/#sec-Interfaces):“类型也可以实现多个接口。例如,Business 实现了示例中的NamedEntityValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity 【参考方案3】:

我认为是的,正如规范在http://facebook.github.io/graphql/June2018/#sec-Interfaces 上描述的那样应该是可能的。

这是一个例子。

interface NamedEntity 
  name: String


interface ValuedEntity 
  value: Int


type Person implements NamedEntity 
  name: String
  age: Int


type Business implements NamedEntity & ValuedEntity 
  name: String
  value: Int
  employeeCount: Int

【讨论】:

根据最新版本的规范(graphql.github.io/graphql-spec/draft/#sec-Interfaces):“类型也可以实现多个接口。例如,Business 实现了示例中的NamedEntityValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity

以上是关于是否可以在 GraphQL 中实现多个接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQl JS 中实现带有破折号的枚举

是否可以在一个堆栈中实现多个队列?

如何在 GraphQL HotChocolate 中实现订阅?

在 C++ 中实现多个接口

是否可以将接口的参数类型留给在 Go 中实现它的接收器?

如何在express中实现resolveType函数/初始化graphQL服务器