问题标签 [sorbet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
58 浏览

ruby - 将 Sorbet RBI 添加到 gem 的目录结构是什么?

我有一个我想添加类型的gem (通过提交 PR 或通过 fork 仅在我的项目中使用),但除了创建文件夹之外,文档没有提供更多指导。/rbi

大声思考,它应该lib/使用添加的类型签名来镜像文件,还是应该像sorbet-typed中的签名一样是一个大文件(每个版本?) ?

我还不知道有任何宝石这样做,文档也没有提到它。

0 投票
1 回答
69 浏览

ruby - 冰糕中的递归 type_alias

如何声明一个可以包含对自身的引用的类型别名?例如,标记返回类似 JSON 结构的函数。

试:

给出以下错误:

类型别名Foo参与一个循环

0 投票
1 回答
75 浏览

ruby - 冰糕可变数组长度

我刚开始玩冰糕宝石。我有一个期望并返回对象数组的方法。问题是,数组的长度是变化的。如何键入检查方法?我不断得到Expected type [Object], got array of size 2

这是我的方法

0 投票
1 回答
110 浏览

ruby - 冰糕泛型问题 - 在参数位置具有类型变量的方法

我正在尝试让这个 Sorbet 代码正常工作(Sorbet 操场上):

但是,我收到类型错误:

我不确定如何将blah方法单态化,以便它可以采用 type 的参数Foo[Integer]。Sorbet 目前是否支持此用例?

0 投票
1 回答
120 浏览

ruby - 在单例方法上使用 sorbet 接口抽象

我喜欢冰糕的界面功能!

在 sorbet 文档中有一段使单例方法抽象。这似乎是反序列化和迁移(向上转换)的一个很棒的功能。

我的想法是将类型化结构的序列化版本存储在数据库中。因为结构可能会随着时间而发展,所以我还想提供一些功能来将结构的旧序列化版本转换为当前版本。

实现这一点的方法是将类的名称、数据和版本保存到数据库中。假设这个结构

数据存储中的旧序列化版本可能如下所示:

班级 数据 版本
MyStruct {"v1_field": "v1 value"} 1

我不能只是反序列化数据,因为它缺少必填字段v2_field。所以我的想法是为迁移提供单例方法。

注意:我意识到结构字段有一个默认选项,但是有些迁移不能用这个来建模(比如重命名字段名称)。不幸的是,这些单例方法接口的行为方式与我期望接口工作的方式不同:

此代码(或此代码的变体)将不起作用,因为 sorbet 会引发错误:

将签名更改为T.class_of(VersionedStruct)将引发相同的错误:

即使方法是在类级别上定义的。我不包括实例级别的方法的主要原因是因为我无法在没有正确数据的情况下实例化结构。

0 投票
1 回答
89 浏览

ruby - 如何在运行时在冰糕中的`T::Struct`上动态定义`prop`s?

我有一个定义为的结构:

注意props 在运行时是如何定义的。

然后在我的代码库的某个地方,在启动时,我做MyStruct.register_props({ foo: T.untyped, bar: T.nilable(T.untyped) }).

通过类型检查传递代码库时,初始化MyStruct会出错。MyStruct.new(foo: 'foo', bar: Bar.new).

如何在运行时定义props onT::Struct而不会出现上述类型检查错误?

0 投票
1 回答
88 浏览

ruby - 我应该如何管理类型信息必须在 rbi 文件中而不是内联的 gem 中的冰糕错误?

我维护pdf-reader ruby​​ gem,并用它来试验冰糕。我以前没有冰糕的经验。

我想使用类型来改善开发体验,并将类型信息与 gem 一起分发,以便使用 sorbet 的下游用户受益。但是,我想避免添加运行时冰糕依赖项。大多数下游用户不使用 sorbet,他们不应该获得新的运行时依赖项。

我认为这意味着我应该将类型信息作为 *.rbi 文件分发到顶级rbi/目录中。我无法将类型内联到我的源(extend T::Sig等)中。

在开发(和测试/ci)期间,类型信息rbi/*.rbi对于静态类型检查很有用。但是我不能依赖在运行时正确的类型(下游用户可能会传递不同的类型),所以在某些情况下,我仍然想像这样确认类型

...即使我的 rbi 文件声明 mediabox 永远不能为零:

..但随后冰糕对代码不满意:

我可以明确忽略该错误:

有什么方法可以保持运行时类型检查而不会抱怨冰糕,也不会忽略错误?或者也许“冰糕方式”只是删除运行时检查并在运行时没有它?

或者我关于只使用 rbi 文件作为类型信息的假设是错误的?

0 投票
0 回答
36 浏览

ruby - 冰糕设置导致 tc 抱怨 rbi 文件?

按照此处的设置说明,我最终运行时得到以下信息bundle exec srb tc

为什么冰糕抱怨rbi它自己创建的文件?我是否错过了必须告诉它忽略 rbi 文件或其他内容的步骤?

我的 gemfile 看起来像

0 投票
1 回答
23 浏览

sorbet - 我可以在源代码中使用没有 sig 的 Sorbet 吗?

我想在工作中的 Ruby 项目中使用 Sorbet。由于我想让该过程尽可能顺利,我想知道是否可以仅使用 sorbet 文件夹中的 RBI 文件添加静态类型检查。想法是避免在源代码中添加签名,所以我的同事不抱怨,然后在 RBI 中添加签名。这样我就可以在本地环境中开始打字并从中受益,直到它足够先进为止。

谢谢

0 投票
1 回答
90 浏览

ruby - 如何解决冰糕错误:“使用未声明的变量”?

我正在尝试将冰糕类型信息添加到我的 gem pdf 阅读器中。我不希望 sorbet 成为 gem 的运行时依赖项,因此所有类型注释都在rbi/目录中的外部文件中。我也不能T::Sig在我的课程中扩展。

我想typed: strict在某些文件中启用,但这样做表明我正在使用一些没有类型注释的实例变量:

建议的修复方法是使用T.let()

但是我不能这样做,因为它需要对冰糕的运行时依赖。

是否可以在 rbi 文件中记录实例变量的注释?