【发布时间】:2017-12-26 21:30:01
【问题描述】:
是否可以在 GraphQL 模式中指定实现多个接口的类型?如果是这样,这将如何实现?
【问题讨论】:
标签: graphql
是否可以在 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 版开始支持此功能。
【讨论】:
Business 实现了示例中的NamedEntity 和ValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity {
似乎逗号分隔接口不再起作用。我不得不使用“&”来让它工作(阿波罗),看到这个答案https://stackoverflow.com/a/49521662/1959584
type Something implements First & Second
【讨论】:
Business 实现了示例中的NamedEntity 和ValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity {
我认为是的,正如规范在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
}
【讨论】:
Business 实现了示例中的NamedEntity 和ValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity {