Graphql 数据建模:扩展类型和接口

Mar*_*arc 6 graphql

这是一个非常基本的问题,但是如何调用扩展类型或接口?

所有文档都指向用于extend type Person添加基于 Person 的字段。

我希望它像这样工作

Employee extend type Person {
   salary: Int!
}
Run Code Online (Sandbox Code Playgroud)

但文档表明它是这样的:

extend type Person{
   salary: Int!
}
Run Code Online (Sandbox Code Playgroud)

那么,我如何查询员工工资?如果 Person 有多个扩展名,例如 Employee 和 Renter 呢?我想我可能会受到传统思维的阻碍,但我希望扩展能够产生命名和可查询的东西。

Dan*_*den 7

extend关键字有效地用于修改模式中的现有类型。这最常用于两种情况:

1. 连接表示单个模式的多个字符串。您可以将架构分解为按域划分的多个文件。然后,您可以执行以下操作:

#base.graphql
type Query {
  viewer: User
}

# user.graphql
extend type Query {
  users: [User!]!
}

# post.graphql
extend type Query {
  post: [Post!]!
}
Run Code Online (Sandbox Code Playgroud)

这会产生一个实际上与以下相同的模式:

type Query {
  viewer: User
  users: [User!]!
  post: [Post!]!
}
Run Code Online (Sandbox Code Playgroud)

2. 从基础架构扩展。您可能有多个建立在某个基本架构之上的架构。或者您可能正在将远程模式拼接在一起。在这些场景中,我们通常希望添加特定于我们的新架构的字段,而这些字段在基本类型中不存在。这也可用于实现基本架构中缺少的指令:

extend type SomeType @customDirective
Run Code Online (Sandbox Code Playgroud)

extend关键字只能修改现有类型; 它不是继承的工具。事实上,GraphQL 不支持类型继承。接口提供对现有类型的抽象级别,但实现接口的类型不会从该接口继承任何字段。没有办法做到这一点,除非你使用像graphql-s2s这样的库