📚

rbs-inlineの書き方お勉強

2024/12/05に公開

この記事について

rbs-inlineの書き方をお勉強したときのメモ
https://github.com/soutaro/rbs-inline

rbsファイルを触らなくても良いというのはすごく助かります🙏

rbs-inlineで書いてみる

ありそうなModelを例に

class A < ActiveRecord::Base
  # attr_xxxは末尾に型宣言が可能
  attr_reader :attr_a #! Integer
  attr_accessor :attr_b #! String
  
  # attributeは直定義できないので、!@rbsで仮想Attrを宣言する必要がある
  attribute :attr_c
  # !@rbs
  #   attr_accessor attr_c (): String
  
  FOO = [1,2,3].sample #: Integer

  validates :validate_a
  
  class << self
    # @rbs value: String
    # @rbs kwd_a: String
    # @rbs kwd_b: String?
    # @rbs **: untyped
    # @rbs return: String
    def convert_value(value, kwd_a:, kwd_b: nil, **)
      value.gsub(kwd_a, kwd_b.to_s)
    end
    
    # @rbs ids: [Integer]
    # @rbs return: A::ActiveRecord::Relation
    def find_aaa(ids)
      where(id: ids)
    end
    
    # @rbs ids: [Integer] | nil
    # @rbs return: [A]
    def find_aaa_to_a(ids: nil)
      where(id: ids).to_a      
    end
  end
  
  # nilになる可能性があるので、末尾は?になる
  # @rbs return: Integer?
  def xxx_id
    xxx&.id    
  end
  
  private

    # リレーションが空でnilになる可能性があるので、末尾は?になる
    # @rbs return: User?
    def xxx
      @xxx ||= users.first
    end
    # インスタンス変数は外で定義する(外から見る変数ではないので定義してもしなくても良いと思う)
    # @rbs @xxx: User?
  
    # 戻り値はないので、void
    # @rbs return: void
    def validate_a
      return if a.present?
      
      errors.add(:a, :invalid)
    end
end

Discussion