是否可以指定在GraphQL架构中实现多个接口的类型?如果是这样,这将如何实现?
答案 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
}