首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GraphQLInterfaceType中的接口是什么?

GraphQLInterfaceType中的接口是什么?
EN

Stack Overflow用户
提问于 2018-03-15 20:35:12
回答 1查看 660关注 0票数 0

我有以下代码片段:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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)
    }
  }
});

为什么我要定义一个接口?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-15 22:43:51

在GraphQL中,接口实现了两个目的:

  1. 它们确保实现它们的类型也实现特定的字段。例如,这里的Node接口有一个id字段--这意味着实现Node接口的任何类型都需要有一个id字段(并且id需要是一个ID标量,就像接口中的ID标量) --与这些参数相同--接口中字段上的任何参数也必须存在于实现类型中的匹配字段中。
  2. 当一个字段需要两个或多个类型时,可以使用它们。字段将始终解析为一种类型或标量,但是,通过使用接口(或联合),我们在模式中指出,字段可以将解析为一组类型之一。

因此,假设我们在代码段中有一个Node,实现它的一些类型,以及返回一个节点的查询:

代码语言:javascript
代码运行次数:0
运行
复制
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可以解析为FooBar。当我们编写查询时,我们不知道哪个查询会被解析。但是,由于我们知道接口需要id字段,所以我们可以编写如下查询:

代码语言:javascript
代码运行次数:0
运行
复制
query OperationName {
  getNode(id: "SOME_ID"){
    id
  }
}

但是,如果我们也需要查询someBarField,则不能这样做:

代码语言:javascript
代码运行次数:0
运行
复制
query OperationName {
  getNode(id: "SOME_ID"){
    id
    someBarField
  }
}

因为Foo没有这个字段。相反,我们必须利用一个片段,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
query OperationName {
  getNode(id: "SOME_ID"){
    id
    ... on Bar {
      someBarField
    }
  }
}

然后将返回someBarField,但前提是字段解析为Bar类型。如果是Foo,则只返回id。类似地,您可以从实现相同接口的任何类型请求非共享字段:

代码语言:javascript
代码运行次数:0
运行
复制
query OperationName {
  getNode(id: "SOME_ID"){
    id
    ... on Bar {
      someBarField
    }
    ... on Foo {
      someFooField
    }
  }
}

最后但并非最不重要的是,应该提到工会的工作方式是非常相似的。但是,与接口不同的是,没有为Union定义共享字段,因此类型不会“实现”一个联合,它只是一个联合的一部分。这意味着当请求返回一个联合的字段时,您总是必须使用片段,因为没有共享字段可请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49308725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档