(请注意,这在 sorbet.run 上无法重现,据我所知,它只能用 Sorbet 的本地副本重现)
我希望我可以使用Typed Structs 功能来创建一个方法签名,其中一个参数是options
哈希,但这不起作用:
# typed: true
require 'sorbet-runtime'
extend T::Sig
class OptionsStruct < T::Struct
prop :x, Integer, default: 1
end
sig { params(options: OptionsStruct).void }
def method(options)
puts options.x
end
# This works
method(OptionsStruct.new({x: 2}))
# This causes the typechecker to throw.
method({x: 2})
本质上,当您对该文件进行类型检查时,它会抱怨传入哈希,而此时需要一个 Struct。我的问题是:如何为具有特定参数的哈希定义有效签名?结构显然在这里不起作用。虽然我没有尝试过 Shapes,但根据文档,它们非常有限,所以如果可能的话,我不想使用它们。
关于泛型的文档提到了散列,但似乎建议它们只能在散列的键和值都是相同类型的情况下使用(例如Hash<Symbol, String>
,要求所有键都是符号,所有值都是字符串),并且不提供任何方法(据我所知)定义具有特定键的哈希。
谢谢!