0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Basic Study LogAdvent Calendar 2024

Day 18

GraphQLを1から勉強しなおしてみた ~ スキーマと型 Part2 ~

Posted at

はじめに

先日に引き続き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
    }
  }
}

またインターフェース型で記載したように、HumanDroidCharacterインターフェースを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)
   }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?