如何揭示泛型
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。
我有以下通用类型定义:
# 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。