首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails AggregateRoot on "on“处理程序未被检测为实例方法

Rails AggregateRoot on "on“处理程序未被检测为实例方法
EN

Stack Overflow用户
提问于 2022-07-07 12:48:50
回答 1查看 40关注 0票数 0

在Rails事件存储中,AggregateRoot具有DSL方法,这些方法导致具有此形状的块:

代码语言:javascript
复制
class X
  extend AggregateRoot::OnDSL

  class MyEvent < RailsEventStore::Event; end

  on MyEvent do |event|
    # Code
  end
end

在这个块中,可以访问类实例数据。但冰糕不知道。

有没有办法告诉Sorbet,该块将作为实例方法被注入?

我可以将字段或方法的每次使用标记为T.unsafe(),但这将从其中移除类型,并且添加强制转换会使代码难以阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-11 20:41:07

您可以使用T.bind与Sorbet通信,self在特定块中具有特定类型:

代码语言:javascript
复制
class X
  extend AggregateRoot::OnDSL

  class MyEvent < RailsEventStore::Event; end

  on MyEvent do |event|
    T.bind(self, MyEvent)
    # Code
  end
end

更广泛地说,您可以添加一个shim,它指定像这样的DSL和指定proc将绑定到的类型。 (如:T.proc.bind(TheTypeOfSelfInTheBlock).params(...).returns(...) )的类型。

在这种情况下,对于AggregateRoot::OnDSL.on来说,如果不是不可能的话,它会有点棘手,原因有两个:

  1. on需要一个*event_klasses。您无法确定哪个事件类触发了您的块,因此您无法静态地知道传递给您的块的事件是哪个event_klasses
  2. event_klasses的类型应该是event_klasses: T.class_of(RailsEventStore::Event)。即使它是一个奇异值,您也需要泛型系统来表示块的参数是特定的event_klasses类型(而不仅仅是任何RailsEventStore::Event)。我认为这目前是不可能的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72898097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档