我有以下代码片段:
export const NodeInterface = new GraphQLInterfaceType({
name: 'Node',
fields: {
id: {
type: new GraphQLNonNull(GraphQLID)
}
},
resolveType: (source) => {
if (source.__tableName === tables.users.getName()) {
return UserType;
}
return PostType;
}
});
以及正在使用该接口的GraphQLObjectType
:
export const PostType = new GraphQLObjectType({
name: 'Post',
interfaces: [ NodeInterface ],
fields: {
id: {
type: new GraphQLNonNull(GraphQLID),
resolve: resolveId
},
createdAt: {
type: new GraphQLNonNull(GraphQLString),
},
body: {
type: new GraphQLNonNull(GraphQLString)
}
}
});
为什么我要定义一个接口?
发布于 2018-03-15 14:43:51
在GraphQL中,接口实现了两个目的:
Node
接口有一个id
字段--这意味着实现Node
接口的任何类型都需要有一个id
字段(并且id
需要是一个ID标量,就像接口中的ID标量) --与这些参数相同--接口中字段上的任何参数也必须存在于实现类型中的匹配字段中。因此,假设我们在代码段中有一个Node
,实现它的一些类型,以及返回一个节点的查询:
interface Node {
id: ID!
}
type Foo implements Node {
id: ID!
someFooField: String!
someOtherFooField: Int!
}
type Bar implements Node {
id: ID!
someBarField: String!
someOtherFooField: Int!
}
type Query {
getNode(id: ID!): Node!
}
在我们的示例中,getNode
可以解析为Foo
或Bar
。当我们编写查询时,我们不知道哪个查询会被解析。但是,由于我们知道接口需要id
字段,所以我们可以编写如下查询:
query OperationName {
getNode(id: "SOME_ID"){
id
}
}
但是,如果我们也需要查询someBarField
,则不能这样做:
query OperationName {
getNode(id: "SOME_ID"){
id
someBarField
}
}
因为Foo
没有这个字段。相反,我们必须利用一个片段,如下所示:
query OperationName {
getNode(id: "SOME_ID"){
id
... on Bar {
someBarField
}
}
}
然后将返回someBarField
,但前提是字段解析为Bar
类型。如果是Foo
,则只返回id。类似地,您可以从实现相同接口的任何类型请求非共享字段:
query OperationName {
getNode(id: "SOME_ID"){
id
... on Bar {
someBarField
}
... on Foo {
someFooField
}
}
}
最后但并非最不重要的是,应该提到工会的工作方式是非常相似的。但是,与接口不同的是,没有为Union定义共享字段,因此类型不会“实现”一个联合,它只是一个联合的一部分。这意味着当请求返回一个联合的字段时,您总是必须使用片段,因为没有共享字段可请求。
https://stackoverflow.com/questions/49308725
复制相似问题