如何揭示泛型

时间:2019-06-22 11:32:02

标签: ruby sorbet

我具有以下通用类型定义:

# 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 个答案:

答案 0 :(得分:1)

A[Integer].new(42)是指定泛型类型的正确方法。

您可能希望冰糕从输入(42)推断类型Integer。但是,果汁冰糕不能那样工作。您必须将通用类型指定为A [Integer],然后冰糕将在运行时使用它来验证输入(42)和输出(@value)的类型。

  

我知道可以显式指定参数的类型A [Integer] .new(42),但是那样一来,我就无法在.rbi文件中单独放置保持类型信息。

可能无法像普通类型那样将类型构造(或sorbet构造)和代码清晰地分开。正如您甚至对于T :: Array或T :: Hash所看到的,还必须以相同的方式指定类型。为了保持稳定,您经常需要使用T.let。