GraphQLでインターフェースを実装する際に「Interface field "X" expected but "Y" does not provide it」というエラーに遭遇することがあります。このエラーは、インターフェースで定義されたフィールドが、そのインターフェースを実装する型で提供されていない場合に発生します。本記事では、このエラーの原因と解決方法について詳しく解説します。

エラーの原因

このエラーが発生する主な理由は以下の通りです:

1. インターフェースで定義されたフィールドが、実装する型で欠落している

2. フィールド名のスペルミスや大文字小文字の違い

3. フィールドの型が一致していない

解決方法

1. 欠落しているフィールドを追加する

まず、インターフェースの定義を確認し、実装する型に必要なフィールドをすべて含めているか確認します。

interface Node {
  id: ID!
  name: String!
}

type User implements Node {
  id: ID!
  name: String!
  email: String # 追加のフィールドは問題ありません
}

2. フィールド名を正確に一致させる

フィールド名は大文字小文字を含めて完全に一致する必要があります。

interface Node {
  id: ID!
  userName: String!
}

type User implements Node {
  id: ID!
  userName: String! # 'username' ではなく 'userName' と正確に一致させる
}

3. フィールドの型を一致させる

インターフェースと実装する型のフィールドの型は完全に一致する必要があります。

interface Node {
  id: ID!
  age: Int!
}

type User implements Node {
  id: ID!
  age: Int! # 'String' ではなく 'Int' を使用
}

4. Nullable フィールドの扱い

インターフェースで Nullable として定義されたフィールドは、実装する型で Non-Nullable にすることができます。逆は不可能です。

interface Node {
  id: ID!
  description: String
}

type User implements Node {
  id: ID!
  description: String! # インターフェースでは Nullable だが、ここでは Non-Nullable にできる
}

5. スキーマの再生成

変更を加えた後、スキーマを再生成することで問題が解決する場合があります。使用しているツールやフレームワークに応じて、適切なコマンドを実行してください。

npm run generate-schema
# または
yarn generate-schema

まとめ

「Interface field "X" expected but "Y" does not provide it」エラーは、GraphQLスキーマの一貫性を保つために重要な警告です。インターフェースと実装する型のフィールドを慎重に確認し、名前、型、Nullability が正確に一致していることを確認することで、このエラーを解決できます。

適切なスキーマ設計と定期的なチェックにより、より堅牢で保守性の高いGraphQLアプリケーションを構築することができます。エラーメッセージを注意深く読み、上記の解決策を適用することで、多くの場合このエラーを迅速に解決できるでしょう。