【问题标题】:Graphql data modeling: extending types and interfacesGraphql 数据建模:扩展类型和接口
【发布时间】:2019-07-23 15:53:13
【问题描述】:

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

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

我希望它能像这样工作

Employee extend type Person {
   salary: Int!
}

但文档表明它是这样的:

extend type Person{
   salary: Int!
}

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

【问题讨论】:

    标签: graphql


    【解决方案1】:

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

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

    #base.graphql
    type Query {
      viewer: User
    }
    
    # user.graphql
    extend type Query {
      users: [User!]!
    }
    
    # post.graphql
    extend type Query {
      post: [Post!]!
    }
    

    这会产生一个实际上与以下内容相同的架构:

    type Query {
      viewer: User
      users: [User!]!
      post: [Post!]!
    }
    

    2。从基础架构扩展。您可能有多个架构在某个基础架构之上。或者你可能是stitching together remote schemas。在这些场景中,我们经常希望添加特定于我们的新模式的字段,这些字段在基本类型中不存在。这也可用于实现基本架构中缺少的指令:

    extend type SomeType @customDirective
    

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

    【讨论】:

    • 好的,是的,所以我确实受到传统思维的阻碍。我确实在假设某种继承。
    • 好的,那么query for the local field added via extend 的实际情况如何?代码生成GraphQLError: Cannot query field "salary" on type "Person".
    • @DanDascalescu 这将是一个很好的单独问题,因为它不直接涉及原始问题的主题或我的答案。
    • OP(也)问:“那么,我如何查询员工工资?”,这就是我在该示例中尝试做的事情。 schema definition works, querying does not.
    • 就像我在回复您的 Github 评论时解释的那样,buildSchema 不支持扩展。它只是忽略碰巧存在的任何类型系统扩展定义。您正在正确查询它,但您需要使用不同的方式构建您的架构。
    猜你喜欢
    • 2019-02-14
    • 2021-08-07
    • 2015-04-01
    • 2017-09-05
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-03-13
    相关资源
    最近更新 更多