1

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

这是我的方法

sig { params(foo: Array[Object]).returns(Array[Object]) }
def bar(foo)
  # code to modify some of the attributes
end
4

1 回答 1

2

tl; dr您有语法错误。使用T::Array[Object](不是Array[Object])。

您对数组使用了不正确的类型语法:

# typed: strict

extend T::Sig

sig { params(foo: Array[Object]).returns(Array[Object]) }
def bar(foo)
  # code to modify some of the attributes
end

→ 在 sorbet.run 上查看

错误显示:

editor.rb:5: Use T::Array[...], not Array[...] to declare a typed Array https://srb.help/5026
     5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
                                                 ^^^^^^^^^^^^^
  Note:
    Array[...] will raise at runtime because this generic was defined in the standard library
  Autocorrect: Use `-a` to autocorrect
    editor.rb:5: Replace with T::Array
     5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
                                                 ^^^^^

editor.rb:5: Use T::Array[...], not Array[...] to declare a typed Array https://srb.help/5026
     5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
                          ^^^^^^^^^^^^^
  Note:
    Array[...] will raise at runtime because this generic was defined in the standard library
  Autocorrect: Use `-a` to autocorrect
    editor.rb:5: Replace with T::Array
     5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
                          ^^^^^
Errors: 2

为什么会这样?

[]on 方法具有特殊含义,Array但 Sorbet[]用于泛型类型参数。为了解决这个问题,Sorbet 使用T::标准库中某些泛型类的命名空间:

https://sorbet.org/docs/stdlib-generics

在你的情况下发生的是这段代码:

Array[Object]

相当于写了这个:

[Object]

(即,“制作一个长度为 1 的数组,其中包含值Object”)。[Object]在 Sorbet 中恰好是表达 a 的方式1-tuple

于 2021-10-01T00:05:36.993 回答