React-Redux 应用程序中的不变性 - Immutablejs 和 Typescript 冲突

Immutability in React-Redux app - Immutablejs and Typescript Conflict

我们在 Immutable.jsTypeScript 结合时遇到问题,感谢您的意见:

在过去的一年里,我们正在开发一个 react-redux 应用程序。

正如几乎所有最佳实践、常识和 redux docs 中所推荐的,我们的商店数据是不可变的。

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

我们也在 TypeScript 中编写我们的应用程序。

问题是,这两个(Immutable.jsTypeScript)不能很好地发挥。一旦使用 toJSgetgetIn 将不可变对象转换为普通 JS 对象,类型将更改为 any,这打破了存储和组件。

我们试过了

  1. 演员:

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

  1. 修复 Immutable.js 的输入问题:

我们也尝试过自己打字,有时甚至达到了

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;
}

(想法来自

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

但这是废话和大黑客。 我们得出的结论是,我们自己无法修复 Immutable.js 的类型安全。*

  1. 原版:

我们尝试使用普通的对象传播,但随着数据结构变得复杂,不可变对象的合并变得过于复杂并生成了不可读的代码:

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

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

关于记录选项

我们要避免使用record - 它会在终端浏览器中产生一大堆js代码,只有TypeScript需要而用户不需要,这是地狱维护,最后不共享完整的,与纯 JS 对象相同的 API。我在过去的项目中使用过它,这是一次非常糟糕的经历。

问题

我的问题是针对 created/working 使用复杂 React-Redux 应用程序的人:

  1. 有没有人遇到同样的问题?有一个很好的解决方案来处理 Immutable.jsTypeScript?
  2. 有人推荐更好的library/solution,以获得良好的不变性和类型安全性吗?

待更新:

最终,经过一些基准测试和 facebook-groups 讨论,我们转换为 immer,我们不想回头看。很好的解决方案 - 类型化、简单、对象是原生的,因此无需学习新的 api...我们很高兴。