如何揭示泛型

How to reveal generic type

我有以下通用类型定义:

# 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 文件中。

注释泛型类型的正确方法是什么?

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

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

I understand it's possible to specify the type of the argument explicitly A[Integer].new(42), but that way I can't put keep type information separately in .rbi file.

可能不可能像泛型类型那样将类型构造(或 sorbet 构造)和您的代码完全分开。正如您看到的 T::Array 或 T::Hash,您也必须以相同的方式指定类型。对于常量,您经常需要使用 T.let。