2

我有一个定义为的结构:

# typed: true
require 'sorbet-runtime'

class MyStruct < T::Struct
  MyPropType = T.type_alias { T::Hash[Symbol, Class] }
  
  class << self
    extend T::Sig

    sig { params(props: MyPropType).void }
    def register_props(props)
      props.each do |prop_name, prop_type|
        prop(prop_name, prop_type)
      end
    end
  end
end

注意props 在运行时是如何定义的。

然后在我的代码库的某个地方,在启动时,我做MyStruct.register_props({ foo: T.untyped, bar: T.nilable(T.untyped) }).

通过类型检查传递代码库时,初始化MyStruct会出错。MyStruct.new(foo: 'foo', bar: Bar.new).

$ ./bin/srb typecheck

/path/to/file.rb:66: Too many arguments provided for method MyStruct#initialize. Expected: 0, got: 1 https://srb.help/7004

如何在运行时定义props onT::Struct而不会出现上述类型检查错误?

4

1 回答 1

1

AFAIKT::Struct不能动态定义(我的意思是它们可以但是......),因为类型检查器需要静态知道它将拥有哪些道具。对于这种情况,我认为您应该使用T::InexactStruct. 见https://github.com/sorbet/sorbet/blob/master/gems/sorbet-runtime/lib/types/struct.rb

于 2021-11-10T17:29:34.117 回答