Redux, Typescript, Angular, Redux Observable, Ngrx.
Everything is defined once -> implementation and action type definition. Elegant don’t you think ?! Only “downside” is that traditional redux won’t allow you this approach as actions need to be POJOs = objects with no prototype chain. This can be mitigated via custom middleware, which shallow