2022/06/25
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