【问题标题】:What does the interfaces in GraphQLInterfaceType?GraphQLInterfaceType 中的接口是什么?
【发布时间】:2018-03-16 06:43:51
【问题描述】:

我有以下代码sn-p:

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

为了什么我必须定义一个接口?

【问题讨论】:

  • 你读过源代码吗?只是一堂课
  • 我找不到。
  • 真的是因为我花了 4 秒钟,然后我用谷歌搜索了“GraphQLInterfaceType”graphql.org/graphql-js/type/#graphqlinterfacetype
  • 但是并没有提到GraphQLInterfaceType如何与GraphQLObjectType结合使用。

标签: javascript graphql graphql-js


【解决方案1】:

在 GraphQL 中,接口有两个用途:

  1. 它们确保实现它们的类型也实现特定字段。例如,这里的Node 接口有一个id 字段——这意味着任何实现Node 接口的类型也需要有一个id 字段(并且id 需要是一个ID接口中的标量)同样适用于那些参数 - 接口中字段上的任何参数也必须存在于实现类型中的匹配字段上。

  2. 当一个字段需要两种或多种类型时,可以使用它们。一个字段将总是解析为一个类型或标量,但是,通过使用接口(或联合),我们在架构中表明该字段可以解析为一组中的一个类型。

假设我们在你的 sn-p 中有一个 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 可以解析为 FooBar。当我们编写查询时,我们不知道会解决哪一个。但是因为我们知道接口需要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
    }
  }
}

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

【讨论】:

  • 是否使用const NodeInterface = new GraphQLInterfaceType 创建一个接口,例如interface Node { id: ID! }
  • 是的,在 GraphQL.js 中以编程方式定义模式时,您通常将每种类型、接口等定义为变量,以便其他类型可以引用它。或者如果你想使用 SDL(架构定义语言),你可以查看 graphql-tools
猜你喜欢
  • 2011-10-28
  • 2011-02-06
  • 2010-11-04
  • 2012-01-12
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多