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

时间:2017-07-21 00:56:00

标签: graphql

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

3 个答案:

答案 0 :(得分:14)

是。正如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}`);
});

答案 1 :(得分:10)

似乎逗号分隔界面不再起作用了。我不得不使用"&"相反,为了使其工作(阿波罗),请参阅此答案https://stackoverflow.com/a/49521662/1959584

type Something implements First & Second

答案 2 :(得分:5)

我认为是的,应该可以按照规范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
}