Sorbet中如何声明自引用递归type_alias 解决循环报错问题
Sorbet 递归类型别名解决方案
Sorbet 普通的T.type_alias在定义时会立即展开解析内部所有类型引用,直接自引用会触发循环检测报错,要实现递归类型别名请使用专门的T.recursive_type_alias方法。
正确实现示例
针对你的代码示例,修改后可正常运行:
Foo = T.recursive_type_alias { T.any(Integer, T::Array[Foo]) }
T.recursive_type_alias会惰性解析内部的类型引用,允许别名在定义内部引用自身,不会触发循环报错。
扩展:通用类JSON结构类型别名
如果需要标记返回完整JSON结构的函数,可以直接定义覆盖所有JSON合法类型的递归别名:
JSONValue = T.recursive_type_alias do T.any( NilClass, TrueClass, FalseClass, Integer, Float, String, T::Array[JSONValue], T::Hash[String, JSONValue] ) end
注意事项
- 递归类型别名仅用于静态类型检测,运行时表现和普通类型别名完全一致,不会增加额外校验逻辑
- 如果你使用的Sorbet版本过低不支持
T.recursive_type_alias,可以通过自定义接口、给基础类型混入接口的方式实现类似效果,不过这种方案侵入性更强,优先选择T.recursive_type_alias即可。
内容的提问来源于stack exchange,提问作者kyku
相关产品推荐
相关产品推荐

