Но что я хотел бы знать (и не нашел в документах): могу ли я описать тип утки?Как мы можем сделать в YARD, например:
Я обнаружил, что сорбет имеет очень ограниченную поддержку хеширования с конкретными ключами (что поток называет «запечатанный объект» ).Вы можете попробовать что-то вроде этого, но foo
будет распознаваться как T::Hash[T.untyped, T.untyped]
или самое большее T::Hash[String, String]
.
extend T::Sig
sig { returns({to_s: String, to_key: String}) }
def foo
T.unsafe(nil)
end
T.reveal_type(foo)
foo.to_s
foo.to_key
См. На Sorbet.run
Они пытаются решить эту проблему с помощью Типизированная структура ([T::Struct]
), но этоне отличайтесь от того, как вы определяете класс / интерфейс самостоятельно.
Sorbet поддерживает кортеж, но и здесь это не было бы идеально. Смотрите на Sorbet.run
Или это изначально ошибочная идея (потому что в идеале нам нужно также аннотировать методы типа утки. И при этом не теряться в синтаксисе).
Учитывая, что вы хотите аннотировать методы типа утки, тем более определить класс для него.Мне нравится вариант (2), лучший из предложенных вами подходов.
Вместо этого вы также можете сделать NULL постоянным значением.Но, учитывая, как реализован текущий код, он, вероятно, не так хорош, как option (2)
KeyGetter::NULL = KeyGetter.new(nil)