是否可以在GraphQL中实现多个接口? [英] Is it possible to implement multiple interfaces in GraphQL?

查看:7
本文介绍了是否可以在GraphQL中实现多个接口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以指定在GraphQL架构中实现多个接口的类型?如果是,将如何实现这一点?

推荐答案

是。如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中实现多个接口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆