首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GraphQL‘实施者’需要重复字段,这是强制性的吗?如果是的话,根本原因是什么?

为什么GraphQL‘实施者’需要重复字段,这是强制性的吗?如果是的话,根本原因是什么?
EN

Stack Overflow用户
提问于 2017-04-17 10:19:58
回答 2查看 2.3K关注 0票数 10

为什么GraphQL implements关键字需要重复字段,这是强制性的吗?就像文件中的例子:

代码语言:javascript
复制
enum Episode { NEWHOPE, EMPIRE, JEDI }

interface Character {
  id: String
  name: String
  friends: [Character]
  appearsIn: [Episode]
}

type Human implements Character {
  id: String
  name: String
  friends: [Character]
  appearsIn: [Episode]
  homePlanet: String
}

type Droid implements Character {
  id: String
  name: String
  friends: [Character]
  appearsIn: [Episode]
  primaryFunction: String
}

如果是的话,根本原因是什么?

因为如果我要复制,如果我改变了,那么我需要在任何地方改变.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-17 17:51:38

是的,根据当前的等级库,这是强制性的

对象类型必须包括接口中定义的每个字段的名称相同的字段。

它允许您在派生类型中指定更精确的字段类型。可以将字段更改为非空字段,也可以更改为接口或联合的特定子类型。以你的例子为例,让我们假设人类只是其他人类的朋友,对于机器人来说也是一样的。然后,下面的架构是有效的。

代码语言:javascript
复制
interface Character {
  id: String
  name: String
  friends: [Character]
  appearsIn: [Episode]
}

type Human implements Character {
  id: String
  name: String
  friends: [Human] # <- notice Human here
  appearsIn: [Episode]
  homePlanet: String
}

type Droid implements Character {
  id: String
  name: String
  friends: [Droid!]! # <- specified Droid here + added not null
  appearsIn: [Episode]
  primaryFunction: String
}

object字段可能包括接口字段中未定义的附加参数(但不需要任何附加参数)。

查看规范以获得更多详细信息:对象类型验证

票数 15
EN

Stack Overflow用户

发布于 2017-04-17 17:44:17

是的是强制性的。如果有帮助,可以将其看作类似于Java类和接口。接口具有类型签名,但不能有实现。它是在类中写出所有实现,并且类型签名被重复。这使您能够在类型签名中选择子类型或协变量类型,因此它们可能不完全相同。

现在假设您正在使用来自GraphQL的JavaScript对象创建一个graphql-js模式。接口只是字段名和类型。对象类型定义本身具有“实现”或resolveresolveType和其他实际上使其成为可执行模式的属性。

但是,您的示例使用的是模式语言,它根本没有“实现”。因此,它们几乎完全是彼此的重复。您不需要每次都拼出来,您可以使用字符串内插来共享接口的部分。

代码语言:javascript
复制
const characterFields = `
  id: String
  name: String
  friends: [Character]
  appearsIn: [Episode]
`

const typeDefs = `
  interface Character {
    ${characterFields}
  }

  type Human Implements Character {
    ${characterFields}
    homePlanet: String
  }
`

编辑:类似于Java比较,字段可能不是完全相同的类型。正如RomanHotsiy所指出的,您可以使类型非空或使用多态类型的子类型。

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

https://stackoverflow.com/questions/43449564

复制
相关文章

相似问题

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