はじめに
先日に引き続きGraphQLを一から勉強し直していきます。
前回はこちら。
型
インターフェースから続きを書いていく。
インターフェース型
複数の型間で共通のフィールドを定義するための抽象型。
# 抽象型
interface Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
}
type Human implements Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
starships: [Starship]
totalCredits: Int
}
type Droid implements Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
primaryFunction: String
}
また、インターフェースをimplementして新たなインターフェースを定義することもできる。
interface Node {
id: ID!
}
interface Character implements Node {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
}
ユニオン型
複数の型のいずれかを返すことができる型。共通のフィールドを持たない異なる型をまとめる時に使う。
ユニオン型に使えるのは具体的なオブジェクト型のみで、インターフェース型や他のユニオン型を使うことはできない。
ユニオン型
union SearchResult = Human | Droid | Starship
type Human {
name
height
}
type Droid {
name
primaryFunction
}
type Starship {
name
length
}
例
{
search(text: "an") {
__typename
... on Human {
name
height
}
... on Droid {
name
primaryFunction
}
... on Starship {
name
length
}
}
}
またインターフェース型で記載したように、Human
とDroid
はCharacter
インターフェースをimplementしているため、以下のように書くこともできる。
{
search(text: "an") {
__typename
... on Character {
name
}
... on Human {
height
}
... on Droid {
primaryFunction
}
... on Starship {
name
length
}
}
}
input
引数で入力値を指定するときにinput
を使って型を指定することもできる。
input ReviewInput {
stars: Int!
commentary: String
}
type Mutation {
createReview(episode: Episode, review: ReviewInput!): Review
}
ディレクティブ
クエリやスキーマの特定の部分に対して、追加の動作や条件を指定するためのもの。
以下は標準ディレクティブだが、独自のカスタムディレクティブを定義することもできる。
deprecated
非推奨であることを示す。
type User {
fullName: String
name: String @deprecated(reason: "Use fullName.")
}
include
指定された条件がtrue
の場合に含める。
query getUser($withEmail: Boolean!) {
user(id: "1") {
id
name
email @include(if: $withEmail)
}
}
skip
指定された条件がtrue
の場合にスキップする。
query getUser($withoutEmail: Boolean!) {
user(id: "1") {
id
name
email @skip(if: $withoutEmail)
}
}