Sorbet は Zlib::GzipReader をメソッドのパラメータとして許可しません
概要
Sorbet 署名を含むこの Ruby コード:
sig { params(source: T.any(String, Zlib::GzipReader)).returns(T::Boolean) }
def file?(source)
source.is_a?(String) && File.exist?(source.to_s)
end
次のエラーが生成されます。
Malformed type declaration. Generic class without type arguments Zlib::GzipReader https://srb.help/5045
ソースの明らかにされたタイプは Zlib::GzipReader[T.anything] ですが、それを指定すると別のエラーが発生します。
Method [] does not exist on T.class_of(Zlib::GzipReader)[Zlib::GzipReader[T.anything]] https://srb.help/7003
これは zlib.rbi の関連する行で、共分散と関係があると思いますが、それを機能させる方法がわかりません。
解決策
これには、この PR を Sorbet へのアップストリームに促した原因と同じ根本原因があります: https://github.com/sorbet/sorbet/pull/6324
同様の PR を開いて、Zlib::GzipReader の型変数を T.untyped に修正できると思います (Zlib::GzipReader#each は指定されたブロックに文字列インスタンスを生成するようなので、おそらく String にすることもできます)。