Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GraphQLInterfaceType中的接口是什么?_Javascript_Graphql_Graphql Js - Fatal编程技术网

Javascript GraphQLInterfaceType中的接口是什么?

Javascript GraphQLInterfaceType中的接口是什么?,javascript,graphql,graphql-js,Javascript,Graphql,Graphql Js,我在代码片段中有以下内容: export const NodeInterface = new GraphQLInterfaceType({ name: 'Node', fields: { id: { type: new GraphQLNonNull(GraphQLID) } }, resolveType: (source) => { if (source.__tableName === tables.users.getName()) {

我在代码片段中有以下内容:

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

我必须定义什么样的接口?

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

它们确保实现它们的类型也实现特定字段。例如这里的节点接口有一个id字段-这意味着实现节点接口的任何类型也需要有一个id字段,并且该id需要是一个id标量,就像在接口中一样,这些接口上的参数也是一样-接口中的字段上的任何参数也必须存在于实现接口中的匹配字段上类型

当一个字段需要两种或更多类型时,可以使用它们。一个字段总是解析为一种类型或标量,但是,通过使用接口或联合,我们在模式中指出该字段可以解析为一组类型中的一种

假设您的代码段中有一个节点,一些类型实现了它,还有一个查询返回一个节点:

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可以解析为Foo或Bar。当我们编写查询时,我们不知道将解决哪一个问题。但因为我们知道接口需要id字段,所以我们可以编写如下查询:

query OperationName {
  getNode(id: "SOME_ID"){
    id
  }
}
query OperationName {
  getNode(id: "SOME_ID"){
    id
    ... on Bar {
      someBarField
    }
  }
}
但是,如果我们还需要查询someBarField,我们不能这样做:

query OperationName {
  getNode(id: "SOME_ID"){
    id
    someBarField
  }
}
因为Foo没有这个字段。相反,我们必须利用一个片段,如下所示:

query OperationName {
  getNode(id: "SOME_ID"){
    id
  }
}
query OperationName {
  getNode(id: "SOME_ID"){
    id
    ... on Bar {
      someBarField
    }
  }
}
然后将返回someBarField,但前提是该字段解析为类型栏。如果是Foo,则只返回id。同样,您可以从实现相同接口的任何类型请求非共享字段:

query OperationName {
  getNode(id: "SOME_ID"){
    id
    ... on Bar {
      someBarField
    }
    ... on Foo {
      someFooField
    }
  }
}

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

您阅读了源代码吗?这只是一个classI找不到它。真的是因为我花了4秒钟的时间搜索了GraphQLInterfaceType,但它没有提到如何在GraphQLObjectType中使用GraphQLInterfaceType。使用const NodeInterface=new GraphQLInterfaceType,我是否创建了一个接口,比如接口节点{id:id!}?是的,在GraphQL.js中以编程方式定义模式时,通常将每个类型、接口等定义为变量,以便其他类型可以引用它。或者,如果您想使用SDL模式定义语言,可以查看graphql工具