[Ruby][Sorbet] concernsの型定義に依存する側の型も書いて安全かつきれいに

最近concernsの型定義には下記のように依存する側の型も書くようにしてる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module Hoge
  extend T::Sig
  extend ActiveSupport::Concern

  Includer = T.type_alias {T.all(Hoge, Fuga)} # 依存する側のFugaクラスを追加してHogeとFugaの交差型に
  private_constant :Includer

  sig { returns(String) }
  def hoge
    'hoge'
  end

  sig { returns(String) }
  def hoge_fuga
    includer.hoge + includer.fuga # includerは自身とFugaクラスの交差型なので自身のhogeメソッドも見えるしFugaにあるfugaメソッドも参照できる
  end

  private

    sig { returns(Includer) }
    def includer # 名前が適切かと聞かれたら微妙だがとりあえず自身と依存する側両方の型を返すメソッドを用意してこれに依存してメソッド呼び出す形にすることできれいに書ける
      T.bind(self, Includer)
      self
    end
end

class Fuga
  extend T::Sig

  sig { returns(String) }
  def fuga
    'fuga'
  end
end
Built with Hugo
テーマ StackJimmy によって設計されています。