我有一個定義為的結構:
# 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而不出現上述型別檢查錯誤?
uj5u.com熱心網友回復:
AFAIKT::Struct不能動態定義(我的意思是他們可以但是......),因為型別檢查器需要靜態地知道它將擁有哪些道具。對于這種情況,我認為您應該使用T::InexactStruct. 見https://github.com/sorbet/sorbet/blob/master/gems/sorbet-runtime/lib/types/struct.rb
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360001.html
上一篇:如何在vue中呼叫rails服務
