如何使用Ruby RBS为哈希参数声明严格的Schema?
使用RBS为Ruby哈希参数声明严格Schema的方案
问题背景
我们团队开发的应用大量使用Ruby哈希作为数据传输对象(DTO),目前计划结合RBS与Steep优化开发流程,但不清楚如何为哈希参数声明严格的结构约束。现有Ruby代码如下:
module Foo def some_func(args) x, y, z = args.values_at(:x, :y, :z) # do something with the params above end end
希望通过.rbs文件描述args哈希的结构,实现类似TypeScript中类型定义的效果:
type Args = { x: number, y: string, z: Array<number> } function some_func(args: Args): void;
可行方案
完全可以实现,RBS支持通过两种方式定义哈希参数的严格结构:
1. 定义结构体类型(推荐,更贴合DTO语义)
在对应的.rbs文件中,先单独定义一个结构体类型,再用它标注方法参数:
module Foo # 定义Args结构体类型,映射哈希的键值结构 type Args = { x: Integer, y: String, z: Array[Integer] } # 用定义好的类型标注方法参数 def some_func: (Args) -> void end
2. 直接在方法签名中声明哈希结构
如果不需要复用类型,也可以直接在方法签名里写哈希的结构约束:
module Foo def some_func: ({ x: Integer, y: String, z: Array[Integer] }) -> void end
类型校验效果
完成RBS定义后,使用Steep进行类型检查时会严格校验传入的哈希:
- 缺少
x/y/z任意必填键时,会触发类型错误 - 键对应的值类型不匹配(比如给
x传入字符串)时,会抛出错误 - 额外传入未定义的键(如
w: 123),默认会触发警告,可通过Steep配置调整是否允许额外键
内容的提问来源于stack exchange,提问作者TK-95
相关产品推荐
相关产品推荐

