最近concernsの型定義には下記のように依存する側の型も書くようにしてる。
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
Top comments (0)