STERFIELD

Graphql – ユニオン型の書き方

Graphql – ユニオン型の書き方

ユニオンは、スキーマフィールドが複数のオブジェクトタイプの1つを返すことを可能にする抽象的なGraphQLタイプです。

Union Type

Union型を定義するときは、どのオブジェクト型がユニオンに含まれるかを宣言します。

union Media = Book | Movie

フィールドには、戻りタイプとしてユニオン(またはそのユニオンのリスト)を含めることができます。この場合、ユニオンに含まれている任意のオブジェクトタイプを返すことができます。

type Query {
  allMedia: [Media] # This list can include both Book and Movie objects
}
ユニオンに含まれている型は、オブジェクト型である必要があります(スカラー、入力型などではありません)。含まれるタイプは、フィールドを共有する必要はありません。

Example

次のスキーマは、 SearchResultはAuthorまたはBookいずれかを返すことができるUnion型を定義します。

union SearchResult = Book | Author
type Book {
  title: String!
}
type Author {
  name: String!
}
type Query {
  search(contains: String): [SearchResult!]
}
ユニオンを使用すると、Query.searchでAuthorとBook両方を含むリストを返すことができます。

Query a Union

上記のスキーマの有効なクエリは次のとおりです。

query GetSearchResults {
  search(contains: "Shakespeare") {
    __typename
    ... on Book {
      title
     }
     ... on Author {
       name
     }
  }
}

Resolve a Union

ユニオンを完全に解決するには、Apolloサーバーはユニオンのどのタイプが返されるかを指定する必要があります。これを実現する__resolveTypeには、リゾルバーマップでユニオンの関数を定義します。

const resolvers = {
    SearchResult: {
      __resolveType(obj, context, info){
        if(obj.name){
          return'Author';
        }
        if(obj.title){
          return'Book';
        }
       return null; // エラー
    },
},
Query: {
  search: () => { ... }
  },
};
const server = new ApolloServer({
  typeDefs,
  resolvers,
  csrfPrevention:true,
  cache:'bounded',
});
server.listen().then(({ url }) => {
  console.log(🚀 Server ready at ${url})
});

 

関数が有効な型の名前ではない__resolveType値を返す場合、関連する操作はGraphQLエラーを生成します。

Author Profile

著者近影

スターフィールド編集部

SHARE

合わせて読みたい