web-dev-qa-db-ja.com

GraphQLでtypeDefsを継承または拡張する方法

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のように見えます

6
Chris Geirman

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
}
7
Daniel Rearden