RBS でハッシュまたはキーワード引数を取ることができるメソッドの型シグネチャ

概要

次のメソッドの RBS に型チェックのサポートを追加しようとしています。

      def create_bridge(caps:, url:, http_client: nil)
        Remote::Bridge.new(http_client: http_client, url: url).tap do |bridge|
          bridge.create_session(caps)
        end
      end

このメソッドは次の方法で呼び出すことができます。

      def initialize(bridge: nil, listener: nil, **opts)
        @devtools = nil
        @bidi = nil
        bridge ||= create_bridge(**opts)
        add_extensions(bridge.browser)
        @bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
      end

そして私はRBSで次のように宣言しました。

def create_bridge: (caps: untyped?, url: untyped?, http_client: untyped? ) -> untyped

これにより、急勾配で実行すると次のエラーが発生します。

lib/selenium/webdriver/common/driver.rb:74:19: [error] More keyword arguments are required: caps, url, http_client
│ Diagnostic ID: Ruby::InsufficientKeywordArguments
│
└         bridge ||= create_bridge(**opts)
                     ~~~~~~~~~~~~~~~~~~~~~

ただし、すべてのキーワードをオプションにしようとすると、次のエラーが発生します。

lib/selenium/webdriver/common/driver.rb:315:24: [error] The method parameter is incompatible with the declaration `(?caps: untyped, ?url: untyped, ?http_client: untyped) -> untyped`
│ Diagnostic ID: Ruby::MethodParameterMismatch
│
└       def create_bridge(caps:, url:, http_client: nil)
                          ~~~~~

lib/selenium/webdriver/common/driver.rb:315:31: [error] The method parameter is incompatible with the declaration `(?caps: untyped, ?url: untyped, ?http_client: untyped) -> untyped`
│ Diagnostic ID: Ruby::MethodParameterMismatch
│
└       def create_bridge(caps:, url:, http_client: nil)

メソッド定義をオーバーロードしようとしても同じです

正しい型シグネチャを追加するための最良の方法を教えていただけますか?

この度は誠にありがとうございました

解決策

初期化で値を代入する場合はどうすればよいでしょうか?

      def initialize(bridge: nil, listener: nil, **opts)
        @devtools = nil
        @bidi = nil
        caps = opts[:caps]                   # or handle nil case
        url = opts[:url]                     # or handle nil case
        http_client = opts[:http_client]     # or handle nil case
        bridge ||= create_bridge(caps:, url:, http_client:) # explicitly pass attributes
        add_extensions(bridge.browser)
        @bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
      end