Как выявить универсальный тип - PullRequest
1 голос
/ 22 июня 2019

У меня есть следующее определение универсального типа:

# typed: true
class A 
  extend T::Sig 
  extend T::Generic 
  Value = type_member

  sig { params(value: Value).void }
  def initialize(value)
    @value = value
  end 

  sig { returns(Value) }
  def value 
    @value 
  end
end 

Когда я раскрываю тип #value, я ожидаю, что это Integer, но это T.untyped:

v = A.new(42)
T.reveal_type(v.value) #=> Revealed type: T.untyped https://srb.help/7014

Я понимаю, что можно явно указать тип аргумента A[Integer].new(42), но в этом случае я не могу отдельно хранить информацию о типе в файле .rbi.

Какой правильный путьаннотирующие универсальные типы?

1 Ответ

1 голос
/ 22 июня 2019

A[Integer].new(42) - это правильный способ указать универсальный тип.

Вы, вероятно, ожидаете, что сорбет выведет тип Integer из ввода (42). Тем не менее, сорбет не работает таким образом. Вы должны указать универсальный тип как A [Integer], и sorbet будет использовать его для проверки типа ввода (42) и вывода (@value) во время выполнения.

Я понимаю, что можно явно указать тип аргумента A [Integer] .new (42), но таким образом я не могу поместить информацию о типе хранения отдельно в файл .rbi.

Вероятно, невозможно разделить конструкцию типа (или конструкцию сорбета) и ваш код чисто так, как это делается для универсального типа. Как вы могли видеть даже для T :: Array или T :: Hash, вы также должны указать тип таким же образом. И для постоянного вам часто нужно использовать T.let.

...