[GraphQL Code Generator] より良い型を出力するために初期設定時に avoidOptionals を設定しよう

2024/08/14に公開

公式ドキュメントの手順通りに導入を進めると、avoidOptionals の設定が漏れてしまう場合がある

GraphQL を扱うプロジェクトでは、GraphQL Code Generator を扱っているケースが多いと思います。導入ガイドのドキュメント 通りに実装していけば、型や関数の出力をすることができます。

ただ、導入ガイドのドキュメント では目立ちにくいけれど、自社でフロントエンドもバックエンドも開発してスキーマ駆動開発で進める場合は、設定してしておいた方がいいオプションがあります。それが、avoidOptionals です。

導入ガイドのドキュメント のコードそのままで avoidOptionals を設定しなかったり、false に設定すると、生成された型が optional になります。

// avoidOptionals を設定しなかったり false にした場合
myField?: Maybe<string>

// avoidOptionals を true にした場合
myField: Maybe<string>

上記のコードだけ見ると大したことがないように見えますが、スキーマ次第では数百箇所以上の型定義に影響をすることもあります。

avoidOptions を設定することで、TypeScript の型が実態にあったものになる

TypeScript には nullundefined もありますが、GraphQL では null は存在しても、undefined は存在しません。そのためリクエストをして、値がない場合は null が帰ってくるケースしか考えられません。

もし、導入ガイドのドキュメント に書かれているとおりの設定で出力した型を使うと、フロント側で自作した型を nullundefined も許容するように調整しなければいけなくなったり、undefined にならないようにガードをする必要が出てきます。そのため、avoidOptionalstrue に設定をしましょう。

import type { CodegenConfig } from '@graphql-codegen/cli'
 
const config: CodegenConfig = {
  generates: {
    'path/to/file.ts': {
      plugins: ['typescript'],
      config: {
        // 追加
        avoidOptionals: true
      }
    }
  }
}
export default config

もしくは個別設定ができるので、必要なものに対して true を設定しましょう。

import type { CodegenConfig } from '@graphql-codegen/cli'
 
const config: CodegenConfig = {
  generates: {
    'path/to/file.ts': {
      plugins: ['typescript'],
      config: {
        // 追加
        avoidOptionals: {
          field: true
          inputValue: true
          object: true
          defaultValue: true
        }
      }
    }
  }
}
export default config

これで、オプショナルが外れたコードが出力されます。

myField: Maybe<string>

個人的には、自社でフロントエンドもバックエンド開発をしているのであれば、全て true にしてoptional にならない形にして差し支えないのかなと思っています。

開発が進んできてから直そうとしても query を利用している箇所がたくさんあると、いろいろな箇所を修正する必要が出てくることが考えられますね。初期設定時に設定しておくと良さそうです。

ちなみに、ついでに他の config も設定しておいた方が良さそうですね。開発したいものによって取捨選択になってくると思うので、とりあえず 一覧のリンク だけ貼っておきます。

Discussion