React-Redux应用程序的不变性 - Immutablejs和Typescript Conflict

时间:2018-02-06 15:12:23

标签: reactjs typescript redux immutability immutable.js

Immutable.jsTypeScript结合使用时出现问题,您的意见表示赞赏:

在过去的一年里,我们正在研究react-redux应用程序。

根据几乎所有最佳实践,常识和redux docs中的建议,我们的商店数据是不可变的。

正如上面的redux文档中所建议的那样,正如许多大型项目所使用的那样,以及许多样板正在实施,我们正在使用Immutable.js

我们还在TypeScript编写了我们的应用程序。

问题是,这两个(Immutable.jsTypeScript)不能很好玩。使用toJSgetgetIn将不可变对象转换为普通JS对象后,类型将更改为any,这会破坏类型之间的类型安全性商店和组件。

我们尝试了

  1. 角色:
  2. state.users.getIn(['counts', visits]) as number但我们希望有更好的类型安全性。

    1. 修复Immutable.js的输入:
    2. 我们也试图将它们打造成自己的,有时甚至是

      interface ImmutableMap<T> {
       get<K extends keyof T>(name: K): T[K];
       set<S>(k: string, o: S): ImmutableMap<T & S>;
       getIn(searchKeyPath: any[], notSetValue?: any): T;
      }
      

      (来自here的想法)

      假设只用getIn调用toJS并且总是返回一个JS对象(我们有时会在higher-order-component中这样做 - 但这是另一个故事)。

      但这是垃圾和大黑客。 我们得出的结论是,不可能自己修复Immutable.js的类型安全性。*

      1. 香草:
      2. 我们尝试使用对象扩展来使用vanilla,但随着数据结构变得复杂,不可变对象的合并变得过于复杂并且生成了一个不可读的代码:

        {
            ...state,
            profiles: {
              ...state.profiles,
              [id]: {
                ...state.profiles[id],
                meta: {
                  ...state.profiles[id].meta,
                  [sub]: payload,
                },
              },
            },
        

        我们最终建立了另一个我们需要维护的Immutable.js库 - 太多代码无法支持。

        关于记录选项

        我们希望避免使用record - 它会在最终浏览器中生成大量的js代码,只有TypeScript才需要,而对于用户来说并不是必需的,这是难以维护的,并且最后不会与纯JS对象共享完整,相同的API。我在过去的项目中使用它,这是一个非常糟糕的经历。

        问题

        我的问题适用于使用复杂的React-Redux应用程序创建/使用的人员:

        1. 是否有人遭受同样的问题?有一个很好的解决方案可以使用Immutable.jsTypeScript
        2. 任何人都建议更好的库/解决方案,以获得良好的不变性和类型安全性?

1 个答案:

答案 0 :(得分:1)

更新:

最终,经过一些基准测试和facebook-groups讨论后,我们转换为immer,我们不想回头看。伟大的解决方案 - 打字,简单,对象是原生的,所以不需要学习新的api ...我们很高兴。