はじめに
2021/10 時点の規格を読んでいきます。ご存知でしたか?
意外と知らなかったこと
不要なfragmentの定義を含めたクエリを書いてはいけない
https://spec.graphql.org/October2021/#sec-Fragments-Must-Be-Used
「不要なfragmentの定義を含めたクエリを書いてはいけない」こと自体は、GraphiQLなどで試しているとたまに怒られることから経験的に知っているのですが、規格上そうなっています。クエリの文字数が減ればpayloadも小さくなるので理にかなっていそう。
inline fragmentにdirectiveを書ける
https://spec.graphql.org/October2021/#sec-Inline-Fragments
たしかに @include
directiveを使いたくなりそうですね。書く位置には気をつけましょう。
interfaceは別のinterfaceを実装できる
https://spec.graphql.org/October2021/#sec-Interfaces.Interfaces-Implementing-Interfaces
GraphQLのinterfaceは別のinterfaceを実装できます。規格にあるスキーマの例では、Node
インタフェースと Resource
インタフェースが定義されており、Resource
が Node
インタフェースを実装していることが示されています。
interface Node { id: ID! } interface Resource implements Node { id: ID! url: String }
ちなみにこちらも循環参照はできません。
interfaceには少なくとも1つのフィールドを含める必要がある
https://spec.graphql.org/October2021/#sec-Interfaces.Type-Validation
GraphQLのインタフェースは少なくとも1つのフィールドを持つ必要があります。従って、以下のような空のinterfaceは不正です。
開発に利用するライブラリによっては素通しされてしまうこともあるかもしれません。たとえばRelay v13.0.0ではエラーにならないようでした。
interface Dummy # invalid
規格に準拠していないとどうなるか
ライブラリの振る舞いが保証できなくなります。たとえば、apollo-kotlinでは規格に準拠していないスキーマを使うと以下のような分かりづらいエラーが出る場合があります。