为什么GraphQL implements关键字需要重复字段,这是强制性的吗?就像文件中的例子:
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
}如果是的话,根本原因是什么?
因为如果我要复制,如果我改变了,那么我需要在任何地方改变.
发布于 2017-04-17 17:51:38
是的,根据当前的等级库,这是强制性的
对象类型必须包括接口中定义的每个字段的名称相同的字段。
它允许您在派生类型中指定更精确的字段类型。可以将字段更改为非空字段,也可以更改为接口或联合的特定子类型。以你的例子为例,让我们假设人类只是其他人类的朋友,对于机器人来说也是一样的。然后,下面的架构是有效的。
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字段可能包括接口字段中未定义的附加参数(但不需要任何附加参数)。
查看规范以获得更多详细信息:对象类型验证
发布于 2017-04-17 17:44:17
是的是强制性的。如果有帮助,可以将其看作类似于Java类和接口。接口具有类型签名,但不能有实现。它是在类中写出所有实现,并且类型签名被重复。这使您能够在类型签名中选择子类型或协变量类型,因此它们可能不完全相同。
现在假设您正在使用来自GraphQL的JavaScript对象创建一个graphql-js模式。接口只是字段名和类型。对象类型定义本身具有“实现”或resolve、resolveType和其他实际上使其成为可执行模式的属性。
但是,您的示例使用的是模式语言,它根本没有“实现”。因此,它们几乎完全是彼此的重复。您不需要每次都拼出来,您可以使用字符串内插来共享接口的部分。
const characterFields = `
id: String
name: String
friends: [Character]
appearsIn: [Episode]
`
const typeDefs = `
interface Character {
${characterFields}
}
type Human Implements Character {
${characterFields}
homePlanet: String
}
`编辑:类似于Java比较,字段可能不是完全相同的类型。正如RomanHotsiy所指出的,您可以使类型非空或使用多态类型的子类型。
https://stackoverflow.com/questions/43449564
复制相似问题