Relay 和 GraphQL 接口是什么以及如何工作?
What and How does Relay and GraphQL interfaces work?
我们在 GraphQL 中这样定义一个类型:
const GraphQLTodo = new GraphQLObjectType({
name: 'Todo',
fields: {
id: globalIdField('Todo'),
text: {
type: GraphQLString,
resolve: (obj) => obj.text,
},
complete: {
type: GraphQLBoolean,
resolve: (obj) => obj.complete,
},
},
interfaces: [nodeInterface], // what is this?
});
我读到有 GraphQLInterfaceType - 当类型基本相同但某些字段不同时更合适(这像外键吗?)
在 Relay 中,我们使用 nodeDefinitions 获取 nodefield 和 nodeInterface:
const {nodeInterface, nodeField} = nodeDefinitions(
(globalId) => {
const {type, id} = fromGlobalId(globalId);
if (type === 'Todo') {
return getTodo(id);
} else if (type === 'User') {
return getUser(id);
}
return null;
},
(obj) => {
if (obj instanceof Todo) {
return GraphQLTodo;
} else if (obj instanceof User) {
return GraphQLUser;
}
return null;
}
);
文档和示例只在接口上使用了一个:[] //它是一个数组。但是什么时候需要使用很多接口呢?我只是对它是什么感到困惑,我已经阅读了很多相关内容(不知道我的理解是否正确),只是似乎无法将其包裹在我的脑海中
A GraphQLInterfaceType
是 GraphQL 实现 多态性 的一种方式,即由多个 对象类型 组成的类型。例如,假设您有两个基本对象类型,Post
和 Comment
。假设您想要一个可以获取 评论和帖子 列表的字段。方便的是,这两种类型都有一个 id
、text
和 author
字段。这是接口类型的完美用例。接口类型是一组共享字段,它可以由任何拥有这些字段的对象类型实现。所以我们创建一个 Authored
接口并说 Comment
和 Post
实现这个接口。通过将此 Authored
类型放在 GraphQL 字段上,该字段可以解析帖子或评论(或两种类型的异构列表)。
等等,Post
和 Comment
接受一个 接口数组 。我可以在这里传递多个接口。为什么?由于实现一个接口的要求是拥有该接口中的所有字段,所以任何对象类型都没有理由不能实现多个接口。从你的例子中可以看出,Relay 中的 Node
接口只需要 id
。由于我们的 Post
和 Comment
有 id
,他们可以同时实现 Node
和 Authored
。但是许多其他类型可能会实现 Node
,那些不属于 Authored
.
的类型
这使您的对象类型更加可重用。如果您将接口而不是对象类型分配给您的字段,只要您坚持使用这些商定的接口,就可以轻松地将新的可能类型添加到您的架构中的字段。
我们在 GraphQL 中这样定义一个类型:
const GraphQLTodo = new GraphQLObjectType({
name: 'Todo',
fields: {
id: globalIdField('Todo'),
text: {
type: GraphQLString,
resolve: (obj) => obj.text,
},
complete: {
type: GraphQLBoolean,
resolve: (obj) => obj.complete,
},
},
interfaces: [nodeInterface], // what is this?
});
我读到有 GraphQLInterfaceType - 当类型基本相同但某些字段不同时更合适(这像外键吗?)
在 Relay 中,我们使用 nodeDefinitions 获取 nodefield 和 nodeInterface:
const {nodeInterface, nodeField} = nodeDefinitions(
(globalId) => {
const {type, id} = fromGlobalId(globalId);
if (type === 'Todo') {
return getTodo(id);
} else if (type === 'User') {
return getUser(id);
}
return null;
},
(obj) => {
if (obj instanceof Todo) {
return GraphQLTodo;
} else if (obj instanceof User) {
return GraphQLUser;
}
return null;
}
);
文档和示例只在接口上使用了一个:[] //它是一个数组。但是什么时候需要使用很多接口呢?我只是对它是什么感到困惑,我已经阅读了很多相关内容(不知道我的理解是否正确),只是似乎无法将其包裹在我的脑海中
A GraphQLInterfaceType
是 GraphQL 实现 多态性 的一种方式,即由多个 对象类型 组成的类型。例如,假设您有两个基本对象类型,Post
和 Comment
。假设您想要一个可以获取 评论和帖子 列表的字段。方便的是,这两种类型都有一个 id
、text
和 author
字段。这是接口类型的完美用例。接口类型是一组共享字段,它可以由任何拥有这些字段的对象类型实现。所以我们创建一个 Authored
接口并说 Comment
和 Post
实现这个接口。通过将此 Authored
类型放在 GraphQL 字段上,该字段可以解析帖子或评论(或两种类型的异构列表)。
等等,Post
和 Comment
接受一个 接口数组 。我可以在这里传递多个接口。为什么?由于实现一个接口的要求是拥有该接口中的所有字段,所以任何对象类型都没有理由不能实现多个接口。从你的例子中可以看出,Relay 中的 Node
接口只需要 id
。由于我们的 Post
和 Comment
有 id
,他们可以同时实现 Node
和 Authored
。但是许多其他类型可能会实现 Node
,那些不属于 Authored
.
这使您的对象类型更加可重用。如果您将接口而不是对象类型分配给您的字段,只要您坚持使用这些商定的接口,就可以轻松地将新的可能类型添加到您的架构中的字段。