我具有以下通用类型定义:
# 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
文件中单独放置保持类型信息。
注释泛型类型的正确方法是什么?
答案 0 :(得分:1)
A[Integer].new(42)
是指定泛型类型的正确方法。
您可能希望冰糕从输入(42)推断类型Integer。但是,果汁冰糕不能那样工作。您必须将通用类型指定为A [Integer],然后冰糕将在运行时使用它来验证输入(42)和输出(@value)的类型。
我知道可以显式指定参数的类型A [Integer] .new(42),但是那样一来,我就无法在.rbi文件中单独放置保持类型信息。
可能无法像普通类型那样将类型构造(或sorbet构造)和代码清晰地分开。正如您甚至对于T :: Array或T :: Hash所看到的,还必须以相同的方式指定类型。为了保持稳定,您经常需要使用T.let。