不幸的是,在这一点上,您将无法做更多的事情。即使Shapes
受支持,它们也是实验性功能。
如果您真的想使用哈希,可以将其表示为:
MyType = T.type_alias {T::Hash[String, T.any(String, T::Hash[String, T.untyped])]}
或者,您可以使用T::Struct
:
class MyType < T::Struct
const :key, String
const :value, T.any(String, MyType)
end
您仍然不确定 的类型是什么value
,但是使用flowsensitive,应该很容易处理结构:
class Processor
extend T::Sig
sig {params(my_object: MyType).returns(String)}
def process(my_object)
key = my_object.key
obj_value = my_object.value # this is needed for flow sensitivity below
value = case obj_value
when String
value
when MyType
process(obj_value)
else
T.absurd(obj_value) # this makes sure that if you add a new type to `value`, Sorbet will make you handle it
end
return "key: #{key}, value: #{value}"
end
end