5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Next.js】GraphQL Code Generatorを使ってTypeScriptの型定義を自動化しよう!(GitHub GraphQL API)

Last updated at Posted at 2022-09-30

APIデータを取得した際、取得したデータに対してまずは手動でTypeScriptの型定義を行うかと思いますが、GraphQL Code Generatorを使うと自動でTypeScriptの型定義をすることが出来ます。
型定義の際のTypoがなくなり便利なんですが、環境構築の時点で様々なつまづきポイントがあったので、備忘録がてら記事にしました。
なお、今回はGitHub GraphQL APIを使って説明をします。

対象

  • これまでAPIで取得したデータを手動の型定義を自動化したいが、やり方がわからない方
  • GraphQL Code Generatorの仕組みがイマイチよくわからない方

環境

  • Next.js
  • GitHub GraphQL APIでデータを取得するための準備が出来ている
    (GitHubトークンを取得し、エクスプローラーなどでクエリが作成できている)

初期設定(パッケージのインストールやcodegen.ymlの生成)

まずは公式サイトから必要なものを全てインストールしてください。

この中の手順にある

yarn graphql-code-generator init

を実施するとcodegen.ymlが作成されますが、その際の設定などはこちらのサイトがわかりやすかったので紹介します。

どれも後で変更できますので、とりあえずエンターまたは表示の例に従って打ち込んで先に進んでも構いません!

この記事を書いている2022年9月28日に@graphql-codegen/cli"の最新バージョンが2.13.1となりましたが、その影響か正常にinitが行われなかったため、2.12.1にダウングレードして使用しています。

とりあえず出来あがったcodegen.ymlファイルはこんな感じです。
ここまでは割とスムーズだったかと思います。

overwrite: true
schema: "http://localhost:4000"
documents: "src/**/*.graphql"
generates:
  src/generated/graphql.tsx:
    plugins:
      - "typescript"
      - "typescript-operations"
      - "typescript-react-apollo"
  ./graphql.schema.json:
    plugins:
      - "introspection"

codegen.ymlの設定を変更する

ここが一番大事です。ここでGraphQL APIから取得したデータに型定義がつくように設定を行います。
慣れるまで難しく感じるかもしれませんが、まずは一つ一つ設定をしていきましょう。
くどいですが、頑張りどころですからね!

schema

schemaは、型を生成する元となる参照先のことです。
通常はエンドポイントかGraphQL APIの提供元が出すスキーマを利用します。
GitHubのGraphQL APIにはパブリックスキーマというものがあり、これをダウンロードして利用します。
ダウンロードファイルはschema.docs.graphqlとしてルート直下に置き、それを利用します。

schema: "./schema.docs.graphql"

document

documentはエンドポイントからデータを取得する際のクエリを設定します。
GitHubのGraphQL APIですとエクスプローラーを使ってUIから作成できます。

作成したデータはルート直下に置きます。今回はquery.graphqlとファイル名をつけたので、以下のような設定になります。

documents: "./query.graphql"

なお、作成したクエリの中身を参考に掲載します。
内容は、5件分のリポジトリを最新の更新順に取得するもので、作成日や更新日、リポジトリのURL情報などがとれるように設定しています。

query UseGitHubInfo {
    user(login: "topaoad") {
      name
      url
      repositories(last: 5, orderBy: {field: UPDATED_AT, direction: ASC}) {
        totalCount
        nodes {
          name
          description
          createdAt
          updatedAt
          url
          forkCount
          stargazerCount
          languages(orderBy: {field: SIZE, direction: DESC}, last: 10) {
            totalCount
            totalSize
            edges {
              node {
                id
                name
                color
              }
              size
            }
          }
        }
      }
    }
  }

generates

generatesはschemaとdocumentの設定を元に作成された設定ファイルを格納するパスや、ファイル作成時に使用するプラグインを設定します。
作成後のファイルは型の定義用なので、私は他の手動定義ファイルと同様にtypes配下のパスを設定しました。
好き好きなので、任意の場所を設定してかまいません。

generates:
  src/types/githubGraphQL.ts:

なお、プラグインについてはデフォルトのままにしておいてください。

簡単なまとめ
documentsに設定したGraphQL APIのエンドポイントから取得する際のクエリに対し、schemaの型定義情報と突合する。
その後、型を付与したファイルを作成し、generatesのルートに格納する。
といった仕組みです。

中身を整理した後のcodegen.ymlファイルはこんな感じです。

overwrite: true
schema: "./schema.docs.graphql"
documents: "./query.graphql"
generates:
  src/types/githubGraphQL.ts:
    plugins:
      - "typescript"
      - "typescript-operations"
      - "typescript-react-apollo"

※ ./graphql.schema.json:以下は使用しないので削除しました。

型定義ファイルを生成する

ここまで終わったらいよいよ型定義ファイルの生成なんですが、生成に必要なコマンドは実はpackage.jsonのscriptsの中に
codegen": "graphql-codegen --config codegen.ymlとすでに設定がされています。
(初期化の際のデフォルトがcodegenとなっているため、指示に従って初期化するとこうなります)

"scripts": {
        "dev": "next dev",
        "build": "next build",
        "start": "next start",
        "lint": "next lint",
        "codegen": "graphql-codegen --config codegen.yml"  
    }

なので、npmやyarnでcodegenを走らせてください。
すると、codegen.yml内のgeneratesに設定したディレクトリ(src/generated/graphql.tsx)にファイルが出来上がっているはずです。
(何万行にも及ぶexport typeなどで構成されたコードなので、掲載は省略します。)

作成後の使い方

作成した型定義ファイルを用いてGraphQL APIのエンドポイントから取得したデータに型付けすることができます。
私的にはApollo Clientを使用したデータ取得がわかりやすかったので、そのやり方も記事にしました。
もしよけばこちらの記事もご覧ください。

最後に

最初は馴染みのない設定が多く、戸惑うことも多いかと思います。
実装内容自体は型付けファイルの作成という地味なものですが、今後ますます必須のスキルになるかと思います。
少しでも理解が追い付かず困っている方の助けになれば幸いです。

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?