Reactjs React Redux应用程序中的不变性-Immutablejs和类型脚本冲突
我们对Reactjs React Redux应用程序中的不变性-Immutablejs和类型脚本冲突,reactjs,typescript,redux,immutability,immutable.js,Reactjs,Typescript,Redux,Immutability,Immutable.js,我们对Immutable.js与TypeScript的组合有一个问题,非常感谢您的意见: 在过去的一年里,我们正在开发react redux应用程序 正如在几乎所有最佳实践、常识和实践中所建议的那样,我们的存储数据是不变的 正如上面的redux文档中所建议的那样,正如在许多大型项目中所使用的那样,正如许多样板文件正在实现的那样,我们正在使用 我们也在中编写应用程序 问题是,这两个(Immutable.js和TypeScript)不能很好地发挥作用。一旦使用toJS或get或getIn将不可变对象
Immutable.js
与TypeScript
的组合有一个问题,非常感谢您的意见:
在过去的一年里,我们正在开发react redux应用程序
正如在几乎所有最佳实践、常识和实践中所建议的那样,我们的存储数据是不变的
正如上面的redux文档中所建议的那样,正如在许多大型项目中所使用的那样,正如许多样板文件正在实现的那样,我们正在使用
我们也在中编写应用程序
问题是,这两个(Immutable.js
和TypeScript
)不能很好地发挥作用。一旦使用toJS
或get
或getIn
将不可变对象转换为普通JS对象,类型将更改为any
,这将破坏存储和组件之间的类型安全
我们试过了
state.users.getIn(['counts',visions])作为数字
但我们希望有更好的类型安全性
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;
}
我们最终构建了另一个我们需要维护的Immutable.js
库——需要支持的代码太多了
关于记录选项
我们希望避免使用record
——它会在终端浏览器中生成一大堆js代码,这是TypeScript
所需要的,对用户来说是不必要的,维护起来非常困难,而且最终不会与纯js对象共享完整的相同API。我在过去的项目中使用过它,这是一次非常糟糕的经历
问题
我的问题是针对那些创建/使用复杂React Redux应用程序的人:
Immutable.js
和TypeScript
最终,在一些基准测试和facebook小组讨论之后,我们转向了
immer
,我们不想回头看。伟大的解决方案类型,简单,对象是本地的,所以不需要学习新的api。。。我们很高兴。我同意Immutable.js不能很好地使用TypeScript。我个人使用你的选项3(“香草”),但有时确实有点混乱。我尽量不把我的州埋得太深,尽管如此,在大多数情况下,它运作良好。您可能尝试的一个可能的库是我还没有用过的,但它特别适合打印稿(包含在库中的定义)。
{
...state,
profiles: {
...state.profiles,
[id]: {
...state.profiles[id],
meta: {
...state.profiles[id].meta,
[sub]: payload,
},
},
},