小编klm*_*iGR的帖子

使用 Sorbet 时如何重写 Ruby on Rails 中生成的属性方法?

我有一个带有 jsonb 列的模型。此列仅接受 json 对象。Sorbet 正确生成包含以下内容的 .rbi 文件:

module PushedContent::GeneratedAttributeMethods
  sig { returns(T.nilable(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String))) }
  def value; end

  sig { params(value: T.nilable(T.any(T::Array[T.untyped], T::Boolean, Float, T::Hash[T.untyped, T.untyped], Integer, String))).void }
  def value=(value); end
end
Run Code Online (Sandbox Code Playgroud)

jsonb 列将始终存储数组或哈希值。由于这些方法签名不能满足我的需求,我决定在文件夹下的我自己的文件中覆盖它们:sorbet/rbi/types/app/models/model.rbi

module PushedContent::GeneratedAttributeMethods
  sig { returns(T.nilable(T::Array[T.untyped], T::Hash[T.untyped, T.untyped])) }
  def value; end

  sig { params(value: T.nilable(T::Array[T.untyped], T::Hash[T.untyped, T.untyped])).void }
  def value=(value); end
end
Run Code Online (Sandbox Code Playgroud)

当我运行时,bundle exec rake rails_rbi:models\[Model\]我期望 sorbet 会看到覆盖的方法,并将它们从自动生成的文件中排除。但不幸的是事实并非如此。两个文件中都存在方法。因此,我收到与自动生成的文件相对应的类型错误,而不是与我编写的文件相对应的类型错误。有趣的是,当我运行时srb tc没有错误。

当我从自动生成的文件中删除方法时,类型错误消失了,但显然这不是处理它的最佳方法。

如何覆盖这些方法以便将它们从自动生成的文件中排除?

ruby ruby-on-rails typechecking sorbet

5
推荐指数
0
解决办法
372
查看次数

标签 统计

ruby ×1

ruby-on-rails ×1

sorbet ×1

typechecking ×1