2021-01-13
GraphQLのClientとしてRubyが動くとき、どうやって型を付けるかを考えていた。
# Ruby # @graphql-query QUERY = <<~GRAPHQL currentUser { id name } GRAPHQL v = Client.execute(QUERY) v[:currentUser][:id] # => Integer v[:currentUser][:name] # => String
みたいなコードがある時に、GraphQLのスキーマ定義を元に@graphql-query
コメントがついた定数に型をつけると便利なのでは。
つまり、次のような型を生成するイメージ。
interface QUERY__random_str end QUERY: String & QUERY__random_str class Client def self.execute: (QUERY__random_str) -> { currentUser: { id: Integer, name: String } } | (String) -> Hash[Symbol, untyped] end
QUERY
定数に適当にユニークな型(QUERY__random_str
)をつけておいて、それによってClient.execute
の型でoverloadする。
ユニークな型は文字列リテラル型でも良いのだけど、RBSに書ける文字列リテラル、任意の文字列が書けるかというと不安が……書けるかなあ。改行文字とか。
という雑構想を考えていた。
書いた。Kibelaに型を導入していくならこうやっていくのがスムーズかなあ、という考え。