diary

I like Hatena Star with a text selection.

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に書ける文字列リテラル、任意の文字列が書けるかというと不安が……書けるかなあ。改行文字とか。

という雑構想を考えていた。


bitjourney.kibe.la

書いた。Kibelaに型を導入していくならこうやっていくのがスムーズかなあ、という考え。