Relay和GraphQL接口的工作原理是什么?

时间:2017-03-20 18:07:53

标签: graphql relayjs

我们在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中我们得到nodefield和nodeInterface以及nodeDefinitions:

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;
  }
);

文档和示例仅在接口上使用了一个:[] //它是一个数组。但什么时候需要使用很多接口?我只是对它是什么感到困惑,我已经阅读了很多关于它的内容(不知道我的理解是否正确),似乎无法将它包裹在我脑海中

1 个答案:

答案 0 :(得分:1)

GraphQLInterfaceType是GraphQL实现多态的一种方式,即由多个对象类型组成的类型。例如,假设您有两种基础对象类型PostComment。假设您想要一个可以获得注释和帖子列表的字段。方便的是,这两种类型都有idtextauthor字段。这是接口类型的完美用例。接口类型是一组共享字段,它可以实现拥有这些字段的任何对象类型。因此,我们创建了一个Authored接口,并说CommentPost实现了此接口。通过将此Authored类型放在GraphQL字段上,该字段可以解析帖子或评论(或两种类型的异构列表)。

但是等一下,PostComment接受接口数组。我可以在这里传递多个接口。为什么?由于实现接口的要求是拥有该接口中的所有字段,因此任何对象类型都无法实现多个接口。要从您的示例中提取,Relay中的Node接口只需要id。由于我们的PostCommentid,因此他们可以实现 NodeAuthored。但是许多其他类型可能会实现Node,而Authored不属于let divs = $("#titletextonly"); let array = ['wow', "text"]; for (let i = 0; i < divs.length; i++) { for (let j = 0; j < array.length; j++) { if (divs[i].innerHTML.includes(array[j])) { divs.eq(i).css("background-color", "red"); break; } } }

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