如何声明一个可以包含对自身的引用的类型别名?例如,标记返回类似 JSON 结构的函数。
试:
Foo = T.type_alias { T.any(Integer, T::Array[Foo]) }
给出以下错误:
类型别名
Foo
参与一个循环
从 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 的结构的示例。