0

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

试:

Foo = T.type_alias { T.any(Integer, T::Array[Foo]) }

给出以下错误:

类型别名Foo参与一个循环

4

1 回答 1

1

从 0.5.x 版本开始,这是不可能的,因为类型别名不支持循环。

一种选择是降低结果的类型,并使其:

Foo = T.type_alias { T.any(Integer, T::Array[T.untyped]) }

如果你真的想要进行类型检查,你可以通过将结果包装在一个T::Struct. 但是,这些对象将不再像原来那样平坦(参见sorbet.run):

class Foo < T::Struct
  prop :content, T.any(Integer, T::Array[Foo])
end

myFoo = Foo.new(content: 1)
content = myFoo.content
case content
when Integer
  puts "It was an integer!"
  T.reveal_type(content)
when Array
  puts "It was a Foo!"
  T.reveal_type(content)
else
  T.absurd(content)
end

编辑(2022-02):文档type_alias已更新以解决递归定义。它在sorbet.run中包含一个类似 JSON 的结构的示例。

于 2021-10-05T05:30:39.263 回答