是否可以在 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
实现了示例中的NamedEntity
和ValuedEntity
接口[以下]。” 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
实现了示例中的NamedEntity
和ValuedEntity
接口[以下]。” 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
实现了示例中的NamedEntity
和ValuedEntity
接口[以下]。” type Business implements NamedEntity & ValuedEntity
以上是关于是否可以在 GraphQL 中实现多个接口?的主要内容,如果未能解决你的问题,请参考以下文章