0

假设我有一个名为的共享 gem thing,它可以在多个其他项目中使用,例如example-project. 我想在我的thinggem 中使用冰糕来利用类型检查。如何让我的消费项目检查我的 gem 中的类型?

例如,代码可能如下所示

东西宝石

# typed: strict

require 'sorbet-runtime'

class Thing
  extend T::Sig

  sig { params(phrase: String).returns(String) }
  def say(phrase)
    "Thing said: '#{phrase}'"
  end
end

示例项目

# typed: strict

require 'thing'

Thing.new.say(1) # Should cause a type error

怎么了

运行后srb rbi update,我得到一个sorbet/rbi/gems/thing.rbi

class Thing
  def say(*args, &blk); end
  extend T::Private::Methods::MethodHooks
  extend T::Private::Methods::SingletonMethodHooks
  extend T::Sig
end

这没有我期望的 gem 的信号,srb tc也不会引发我期望的错误。

我尝试过的其他事情

包括rbi/thing.rbi在宝石中

这行得通,但我宁愿在 gem 代码中内联写我的 sig,而不是维护单独的 rbi 文件。是否有任何工具可以获取.rb带有 sigs 的文件并输出.rbi文件(并且可能从.rb文件中剥离 sigs,以便它们可以在没有冰糕的情况下分发 gem)。我正在考虑一个类似于 typescript 的工作流程tsc --declaration,它来自.ts => .d.ts + .js.

4

1 回答 1

1

https://github.com/AaronC81/brain_freeze 是一个新项目,旨在使从具有内联声明的 RB 文件生成 RBI 文件成为可能。现在还早,但可能值得一试

于 2020-03-03T19:45:33.197 回答