Ruby on rails 使用具有流敏感性的联合类型

Ruby on rails 使用具有流敏感性的联合类型,ruby-on-rails,ruby,sorbet,Ruby On Rails,Ruby,Sorbet,我尝试使用带有is_a?的联合类型进行流量控制,但仍然会出现sorbet错误。我也尝试过铸造,但仍然遇到同样的错误,那就是: T.any(T::Array[T.untyped],T::hash[Symbol,T.untyped])的T::Array[T.untyped]组件上不存在散列的方法https://srb.help/7003 我有以下结构: class PostProcessingMethod < T::Struct prop :method_name, Symbol

我尝试使用带有
is_a?
的联合类型进行流量控制,但仍然会出现sorbet错误。我也尝试过铸造,但仍然遇到同样的错误,那就是:

T.any(T::Array[T.untyped],T::hash[Symbol,T.untyped])的T::Array[T.untyped]组件上不存在散列的方法https://srb.help/7003

我有以下结构:

  class PostProcessingMethod < T::Struct
    prop :method_name, Symbol
    prop :args, T.any(Array, T::Hash[Symbol, T.untyped]), default: []
    prop :changed_fields, T::Array[String], default: []
    prop :all, T::Boolean, default: false
    prop :force, T::Boolean, default: false
  end
我尝试合并
T.cast
,以确保sorbet知道它是elsif中的散列,但这似乎没有什么不同


我的期望是,
是一个?
应该允许sorbet知道
后处理方法
elseif
中的一个
散列。但是如果不是这样的话,
T.cast
当然应该处理这个问题。

在发布的代码中,每个
.args
调用都被视为一个新变量。如果在局部变量中捕获返回值,则流敏感度将起作用

请参见上的示例

    sig { params(post_processing_methods: T::Array[Documents::PostProcessingMethod]).void }
    def call(post_processing_methods)
      post_processing_methods.each do |post_processing_method|
        next unless should_call_method?(post_processing_method)

        if @object.respond_to?(post_processing_method.method_name)
          if post_processing_method.args.is_a?(Array)
            @object.send(post_processing_method.method_name, *post_processing_method.args)
          elsif post_processing_method.args.is_a?(Hash)
            @object.send(post_processing_method.method_name, **post_processing_method.args)
          end
        end
      end
    end