GraphQL Code Generatorによる型付きResolver
入力と戻り値に正しい型を付けてResolverを記述します。
「GraphQL Code Generatorによる型付きResolver」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
Resolverの型付けに関する問題
GraphQLのresolverは通常の関数ですが、型付きのシグネチャがないと誤った形の値を返しやすくなります。Codegenはresolverの型を生成し、正しい戻り値を強制します。
// Without typed resolvers — any type allowed
const userResolver = async (_, { id }) => fetchUser(id);Resolversプラグインを追加する
@graphql-codegen/typescript-resolversをインストールして設定し、resolver mapの型を生成してください。
npm install --save-dev @graphql-codegen/typescript-resolversResolvers用のcodegen.yml
基本のTypeScript型と並べて、Resolversプラグインの出力を追加してください。
# codegen.yml
generates:
src/generated/types.ts:
plugins:
- typescript
src/generated/resolvers.ts:
plugins:
- typescript-resolvers生成されたResolverMapを使用する
生成されたResolvers型をresolver mapオブジェクトに適用して、完全な型安全性を確保してください。
import { Resolvers } from "./generated/resolvers";
const resolvers: Resolvers = {
Query: {
user: async (_, { id }) => fetchUser(id),
// Return type enforced: must match User schema
},
};Contextの型付け
Resolversのジェネリック型にコンテキスト型を渡すと、resolver関数が型付きのコンテキストオブジェクトを受け取れるようになります。
interface Context { db: Database; user?: AuthUser; }
// codegen.yml
config:
contextType: "src/context#Context"
// Generated: Resolvers<Context>
const resolvers: Resolvers<Context> = {
Query: {
me: (_, __, ctx) => ctx.user, // ctx: Context
},
};Mapper型
Mapper型を使うと、GraphQL型を内部のモデル型にマッピングできます。そのため、resolverはGraphQLの出力型ではなく、ドメインオブジェクトを返せます。
# codegen.yml
config:
mappers:
User: "src/models#UserModel"フィールドresolverの型付け
型上の個々のフィールドresolverにも型が付き、parent引数とcontext引数も型付けされます。
// Typed field resolver on User type
const resolvers: Resolvers<Context> = {
User: {
fullName: (parent) => `${parent.firstName} ${parent.lastName}`,
// parent is UserModel (from mapper)
},
};型付きMutation
Mutation resolverは、スキーマの入力型から導出された、型付きの入力引数を受け取ります。
// Schema: createUser(input: CreateUserInput!): User!
const resolvers: Resolvers = {
Mutation: {
createUser: (_, { input }) => {
// input: CreateUserInput — fully typed
return createUser(input.name, input.email);
},
},
};型付きSubscription
Subscription resolverにはsubscribe関数とresolve関数があり、どちらもcodegenによって型付けされます。
const resolvers: Resolvers = {
Subscription: {
messageAdded: {
subscribe: () => pubsub.asyncIterator("MESSAGE_ADDED"),
resolve: (payload) => payload.messageAdded, // typed
},
},
};Codegenを同期状態に保つ
スキーマの変更時にresolver型を再生成するpre-buildまたはpre-commitフックを追加し、古い型が本番環境に到達するのを防いでください。
// package.json
{
"scripts": {
"predev": "graphql-codegen",
"prebuild": "graphql-codegen"
}
}振り返り:型付きResolver
typescript-resolversのcodegenプラグインはResolvers型を生成し、すべてのGraphQL resolverで正しい戻り値の形、引数の型、コンテキストの構造を強制します。
確認問題
codegenのcontextType設定オプションは何をしますか?
学んだこと
codegenで型付けされたGraphQL resolverは、resolver map全体で正しい戻り値の型、引数の形、コンテキストオブジェクトを強制します。Mapper型をドメインオブジェクトに使用し、型のずれを防ぐためにcodegenをビルドパイプラインに組み込んでください。
よくある質問
「GraphQL Code Generatorによる型付きResolver」レッスンは無料ですか?
はい。「GraphQL Code Generatorによる型付きResolver」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「GraphQL Code Generatorによる型付きResolver」で何を学びますか?
入力と戻り値に正しい型を付けてResolverを記述します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「GraphQL Code Generatorによる型付きResolver」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GraphQLスキーマからTypeScript型へ
- GraphQL Code Generatorによる型付きResolver
- Apolloとurqlによる型付きGraphQLクライアント
- エンドツーエンドの型安全性:スキーマファーストのワークフロー