私が歌川です

@utgwkk が書いている

GraphQLの規格には書いてあるけど意外と知らなかったこと

はじめに

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 インタフェースが定義されており、ResourceNode インタフェースを実装していることが示されています。

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では規格に準拠していないスキーマを使うと以下のような分かりづらいエラーが出る場合があります。

github.com