我有type User
。用户也可以是type TeamMember
。 User
和TeamMember
之间的唯一区别是添加的字段teamRole: String
。所以,我喜欢做以下的事情,以避免必须冗余地定义所有用户的字段......
type User {
id: ID!,
name: String,
(many other field defs)
}
type TeamMember extends User {
teamRole: String,
}
有人知道这个的语法吗?我认为extend
会是答案,但它似乎更像是javascript的prototype
答案 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;
}
});
}
}