中继和GraphQL接口是什么,如何工作的?

中继和GraphQL接口是什么,如何工作的?,graphql,relayjs,Graphql,Relayjs,我们在GraphQL中定义了如下类型: const GraphQLTodo = new GraphQLObjectType({ name: 'Todo', fields: { id: globalIdField('Todo'), text: { type: GraphQLString, resolve: (obj) => obj.text, }, complete: { type: GraphQLBoolean

我们在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,当类型基本相同但某些字段不同时,它更适合,这有点像外键吗

在中继中,我们使用NodeDefinition获得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;
  }
);
文档和示例仅在接口上使用了一个:[]//它是一个数组。但是什么时候我需要使用很多接口呢?我只是对它是什么感到困惑,我读了很多关于它的书,不知道我的理解是否正确,只是似乎无法把它放在我的脑海中

GraphQLInterfaceType是GraphQL实现多态性的一种方式,即由多个对象类型组成的类型。例如,假设有两种基本对象类型:Post和Comment。假设您想要一个字段,该字段可以同时获得评论和帖子的列表。很方便,这两种类型都有一个id、文本和作者字段。这是接口类型的完美用例。接口类型是一组共享字段,它可以由拥有这些字段的任何对象类型实现。因此,我们创建了一个编写的接口,并说注释和Post实现了这个接口。通过将此编写的类型放置在GraphQL字段中,该字段可以解析POST或COMMENT或这两种类型的异构列表

但是,wait、Post和Comment接受一系列接口。我可以在这里传递多个接口。为什么?由于实现接口的要求是拥有该接口中的所有字段,因此任何对象类型都没有理由不能实现多个接口。从您的示例中可以看出,中继中的节点接口只需要id。因为我们的帖子和评论都有id,所以它们可以实现节点和作者。但许多其他类型可能会实现Node,这些Node不是Authored的一部分

这使对象类型更易于重用。如果将接口分配给字段而不是对象类型,则只要坚持使用这些商定的接口,就可以轻松地向模式中的字段添加新的可能类型