我有一个定义为的结构:
# 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
注意prop
s 在运行时是如何定义的。
然后在我的代码库的某个地方,在启动时,我做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
如何在运行时定义prop
s onT::Struct
而不会出现上述类型检查错误?