【TypeScript】GraphQL Code Generatorで型を自動生成 - GraphQLとTypeScriptの統合
2024-11-10
2024-11-10
概要
TypeScript
でGraphQL APIを扱う際に、手動でクエリやレスポンスの型を定義するのは手間がかかり、メンテナンスが難しくなります。そんなときに役立つのがGraphQL Code Generator
です。GraphQL Code Generatorを使うと、GraphQLスキーマやクエリから自動的に型定義を生成でき、APIの変更にも対応しやすくなります。本記事では、GraphQL Code Generatorを使ってTypeScript
プロジェクトで効率的に型を自動生成する方法を解説します。
GraphQL Code Generatorとは?
GraphQL Code Generatorは、GraphQLスキーマとクエリからTypeScript
の型定義を自動生成するツールです。GraphQL APIとTypeScript
を統合し、型安全性を高め、開発効率を向上させるためのツールで、APIの変更があった場合にも手動の型修正が不要になるため、保守性も向上します。
GraphQL Code Generatorの導入手順
GraphQL Code Generatorを導入するための基本的な手順を以下に示します。
パッケージのインストール
まず、プロジェクトに必要なパッケージをインストールします。
# GraphQL Code Generatorと必要なプラグインのインストール
npm install @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-operations graphql
@graphql-codegen/cli
Code GeneratorのCLIツール@graphql-codegen/typescript
TypeScript
の型を生成するためのプラグイン@graphql-codegen/typescript-operations
GraphQLの操作(クエリ、ミューテーションなど)ごとに型を生成するプラグインgraphql
GraphQLライブラリ本体
設定ファイルの作成
プロジェクトのルートにcodegen.yml
という設定ファイルを作成し、以下のように設定します。
schema: "https://example.com/graphql" # スキーマのURLかローカルファイルのパス
documents: "src//*.graphql" # クエリやミューテーションの定義ファイル
generates:
src/generated/graphql.ts: # 型を出力するファイル
plugins:
- "typescript"
- "typescript-operations"
schema
GraphQLのスキーマのパスまたはURLdocuments
GraphQLクエリやミューテーションの定義ファイルgenerates
型定義の出力先ファイルとプラグイン設定 この設定により、指定したスキーマとクエリからTypeScript
の型が自動生成されます。
型の生成
設定が完了したら、次のコマンドを実行して型を生成します。
npx graphql-codegen
このコマンドを実行すると、src/generated/graphql.ts
に自動的に型定義が生成されます。
自動生成された型の使用方法
GraphQL Code Generatorによって生成された型は、プロジェクト内で簡単にインポートして使用できます。例えば、以下のようなクエリをuser.graphql
ファイルで定義したとします。
# src/queries/user.graphql
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
このクエリに基づいて自動生成された型は、次のように利用できます。
import { GetUserQuery, GetUserQueryVariables } from "./generated/graphql";
// `TypeScript`の型が自動生成されているため、安全にAPIレスポンスを扱える
async function fetchUser(id: string): Promise<GetUserQuery> {
const response = await fetch("https://example.com/graphql", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
query: `
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`,
variables: { id },
}),
});
const data: { data: GetUserQuery } = await response.json();
return data.data;
}
ここでは、GraphQLクエリGetUser
に基づいたGetUserQuery
型と、クエリの引数を型安全に扱うGetUserQueryVariables
型を活用しています。これにより、APIレスポンスや引数の型が保証され、開発効率とコードの安全性が向上します。
高度な設定とプラグインの活用
GraphQL Code Generatorには多くのプラグインや設定があり、プロジェクトのニーズに合わせて型生成をカスタマイズできます。代表的なプラグインのいくつかを紹介します。
typescript-react-apollo
- React Apollo用の型生成
typescript-react-apollo
プラグインを使うと、Apollo Client
と連携したフック(例: useQuery
やuseMutation
)の型を自動生成できます。これにより、Apollo Clientでのデータフェッチが型安全に行えるようになります。
設定例
以下のように、codegen.yml
にプラグインを追加します。
generates:
src/generated/graphql.tsx:
plugins:
- "typescript"
- "typescript-operations"
- "typescript-react-apollo"
config:
withHooks: true # React Hooksの生成を有効化
この設定により、クエリに対応するuseGetUserQuery
といったフックが生成され、Reactコンポーネント内で簡単に型安全なデータ取得が可能になります。
使用例
import React from "react";
import { useGetUserQuery } from "./generated/graphql";
const UserProfile: React.FC<{ userId: string }> = ({ userId }) => {
const { data, loading, error } = useGetUserQuery({
variables: { id: userId },
});
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {error.message}</p>;
return (
<div>
<h1>{data?.user?.name}</h1>
<p>{data?.user?.email}</p>
</div>
);
};
typescript-resolvers
- サーバー側のリゾルバ型生成
typescript-resolvers
プラグインは、サーバーサイドでGraphQLのリゾルバ関数の型を自動生成するために使用します。リゾルバの引数や戻り値の型を保証することで、バックエンドの開発効率と安全性が向上します。
設定例
以下のように、プラグインを設定します。
generates:
src/generated/resolvers.ts:
plugins:
- "typescript"
- "typescript-resolvers"
リゾルバ型が生成されるため、サーバ ー側でのGraphQL API開発がより型安全に行えます。
自動生成により得られる利点
GraphQL Code Generatorによる型自動生成の主な利点は以下の通りです。
- 型安全性の向上
クエリとレスポンスの型が保証されるため、APIの変更に強く、コンパイル時にエラーが検出できるようになります。 - 開発効率の向上
手動で型を定義する必要がなくなり、クエリを追加するたびに自動的に型が生成されるため、開発スピードが上がります。 - メンテナンス性の向上
APIの変更があっても再生成によって型が反映されるため、コードの保守が容易になります。
まとめ
TypeScript
とGraphQL Code Generator
を組み合わせることで、GraphQLスキーマとクエリから自動で型を生成し、型安全なデータ取得が可能になります。ReactアプリケーションにおけるApollo Clientとの連携や、サーバーサイドでのリゾルバの型定義にも対応しており、柔軟かつ効率的な型管理が実現できます。GraphQL Code Generatorを活用して、保守性と開発効率の高いTypeScript
プロジェクトを構築しましょう。