1

我有以下泛型类型定义:

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

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

4

1 回答 1

1

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

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

我知道可以显式指定参数的类型 A[Integer].new(42),但这样我不能将类型信息单独放在 .rbi 文件中。

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

于 2019-06-22T14:17:19.830 回答