如何在GraphQL中继承或扩展typeDefs

时间:2017-11-28 03:15:00

标签: inheritance schema graphql extend extends

我有type User。用户也可以是type TeamMemberUserTeamMember之间的唯一区别是添加的字段teamRole: String。所以,我喜欢做以下的事情,以避免必须冗余地定义所有用户的字段......

  type User {
    id: ID!,
    name: String,
    (many other field defs)
  }

  type TeamMember extends User  {
    teamRole: String,
  }

有人知道这个的语法吗?我认为extend会是答案,但它似乎更像是javascript的prototype

2 个答案:

答案 0 :(得分:5)

Id非常棒,如果你有一个基础架构,并希望基于它构建两个或多个可用的架构。例如,您可以使用所有模式共享的查询定义根extend类型,然后在每个单独的模式中扩展它以添加特定于该模式的查询。它是一种向现有类型添加功能的机制,而不是创建新类型。

GraphQL本身并不支持继承。但是,如果您使用的是GraphQL-JS,那么它会添加此功能。链接here。它添加了泛型类型和类型从另一种类型继承的方式。

答案 1 :(得分:1)

使用像 graphql-s2s 这样的模式转译器来实现继承可能有点过时,而且 graphql-s2s 到 2021 年已经过时了。

看看这个 Apollo Server 指令:https://github.com/jeanbmar/graphql-inherits

const typeDefs = gql`
  directive @inherits(type: String!) on OBJECT

  type Car {
    manufacturer: String
    color: String
  }
  
  type Tesla @inherits(type: "Car") {
    manufacturer: String
    papa: String
    model: String
  }
`;

class InheritsDirective extends SchemaDirectiveVisitor {
    visitObject(type) {
        const fields = type.getFields();
        const baseType = this.schema.getTypeMap()[this.args.type];
        Object.entries(baseType.getFields()).forEach(([name, field]) => {
            if (fields[name] === undefined) {
                fields[name] = field;
            }
        });
    }
}