Допустим, у меня есть общий гем под названием thing
, который используется во многих других проектах, например example-project
. Я хочу использовать сорбет в моем thing
геме, чтобы воспользоваться проверкой типов. Как заставить мои проекты-потребители проверять типы в моем геме?
Например, код может выглядеть следующим образом:
вещь драгоценного камня
# 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
Это не имеет сигнатуры от драгоценного камня, который я ожидаю, и srb tc
не вызывает ошибку, которую я ожидаю.
Другие вещи, которые я пробовал
Включая rbi/thing.rbi
в gem
Это работает, но я лучше напишу свои sigs inline в коде gem, чем поддержу отдельные файлы rbi. Есть ли какой-нибудь инструмент, который мог бы взять файлы .rb
с sigs и вывести файлы .rbi
(и, возможно, вырезать sigs из файлов .rb
, чтобы их гем можно было распространять без сорбета). Я имею в виду рабочий процесс, похожий на машинопись tsc --declaration
, которая начинается с .ts => .d.ts + .js
.