来自flowtype
,我已经习惯使用$Keys<obj>
之类的语言来表达“ obj
中所有键的并集”。另外,$PropertyType<obj, 'key'>
获取obj[key]
的值的类型。
我正在Sorbet中寻找类似的东西,以便可以更好地利用泛型。
理想情况下,我希望key
参数为T.any(<keys in the hash>)
,而返回值为typeof hash[:key]
这就是我想发生的事情:
# my_rbi.rbi
class SomeClass
Elem = type_member
sig { params(key: Keys[Elem]).returns(PropertyType<Elem, key>) }
def [](key); end
end
# somewhere else
sig { returns(SomeClass[{ my_key: String }]) } # add the hash as a generic
def context
# return the context
end
context[:my_key] # works, is a String!
context[:not_my_key] # fails
这有可能吗?我在这里有什么选择?
上下文:
我的用例是graphql-ruby
的类型,尤其是GraphQL::Query::Context
的类型。它实际上将[]
委托给一个内部哈希,我知道它的形状。我想将泛型传递给GraphQL::Query::Context
,例如GraphQL::Query::Context[{ my_key: String }]
。然后,在def []
签名中,我想说一下key
的可用选项是基于通用哈希的。