(обратите внимание, что это не воспроизводится на sorbet.run, насколько это возможно, его можно воспроизвести только с локальной копией Sorbet)
Я надеялся, что смогу использовать функцию Типизированные структуры , чтобы создать сигнатуру метода, где одним из параметров является хеш 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>
требует, чтобы все ключи были символами и все значения be Strings) и не предоставляет никакого способа (насколько я знаю) определять хеш с конкретными ключами.
Спасибо!