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
のように見えます
extend
キーワードは、ベーススキーマがあり、それに基づいて2つ以上の使用可能なスキーマを構築する場合に最適です。たとえば、すべてのスキーマで共有されるクエリでルートQuery
タイプを定義し、それを各スキーマ内で拡張して、そのスキーマに固有のクエリを追加できます。スキーマのモジュール化にも使用できます。ただし、これは既存の型に機能を追加するためのメカニズムにすぎません。新しい型を作成するために使用することはできません。
GraphQLは本質的に継承をサポートしていません。複数の型にまたがるフィールドの重複を回避するのに役立つ構文はありません。
文字列補間を利用すると、同じフィールドを何度も入力する必要がなくなります。
const sharedFields = `
foo: String
bar: String
`
const typeDefs = `
type A {
${sharedFields}
}
type B {
${sharedFields}
}
`
それがなければ、継承とジェネリック型を利用できる graphql-s2s のようなライブラリを利用することもできます。ただし、この方法で生成されたスキーマは、有効なSDLにコンパイルする必要があります-せいぜい、graphql-s2s
のようなライブラリは、いくつかの構文糖とより優れたDXを提供するだけです。
最後に、より構造化された応答を犠牲にしてフィールドの重複を完全に回避するために、タイプを再構築できます。たとえば、これを行う代わりに:
type A {
a: Int
foo: String
bar: String
}
type B {
b: Int
foo: String
bar: String
}
あなたはこれを行うことができます:
type X {
foo: String
bar: String
aOrB: AOrB
}
union AOrB = A | B
type A {
a: Int
}
type B {
b: Int
}