使用多个变量将 Sorbet 类型签名添加到 attr_reader/attr_writer

Adding Sorbet type signatures to attr_reader/attr_writer with multiple variables

我有一个 attr_reader 提供了不止一个变量,像这样:

attr_reader :user, :series

我想为其添加类型签名,但 Sorbet 不支持多个 return 类型,

sig { returns(User, Series) }
attr_reader :user, :series

像这样拆分它们是唯一的选择吗?:

sig { returns(User) }
attr_reader :user
sig { returns(Series) }
attr_reader :series

是的,唯一的选择是拆分您的属性声明,就像您为它们定义单独的 getter/setter 方法时所做的那样,除非您的所有属性都属于同一类型。

这是因为 Sorbet 在其操作的 DSL 阶段实际上在 attr_reader/attr_writer/attr_accessor 声明中使用 sig 来在这些声明生成的合成方法上定义 sig。因此,attr_reader 的单个 getter、attr_writer 的单个 setter 和 attr_accessor 的 getter/setter 对是综合生成的,并且 sigs 应用于它们。

因此,this would be valid:

sig { returns(String) }
attr_reader :some_string_attr, :other_string_attr

但这不会是:

sig { returns(String, User) }
attr_reader :some_string_attr, :some_user_attr