React-Redux 应用程序中的不变性 - Immutablejs 和 Typescript 冲突
Immutability in React-Redux app - Immutablejs and Typescript Conflict
我们在 Immutable.js
与 TypeScript
结合时遇到问题,感谢您的意见:
在过去的一年里,我们正在开发一个 react-redux 应用程序。
正如几乎所有最佳实践、常识和 redux docs 中所推荐的,我们的商店数据是不可变的。
正如上面 redux 文档中所推荐的那样,正如在许多大项目中所使用的那样,以及许多正在实施的样板文件中,我们正在使用 Immutable.js
。
我们也在 TypeScript
中编写我们的应用程序。
问题是,这两个(Immutable.js
和TypeScript
)不能很好地发挥。一旦使用 toJS
或 get
或 getIn
将不可变对象转换为普通 JS 对象,类型将更改为 any
,这打破了存储和组件。
我们试过了
- 演员:
state.users.getIn(['counts', visits]) as number
但我们希望有更好的类型安全。
- 修复
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
的类型安全。*
- 原版:
我们尝试使用普通的对象传播,但随着数据结构变得复杂,不可变对象的合并变得过于复杂并生成了不可读的代码:
{
...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 应用程序的人:
- 有没有人遇到同样的问题?有一个很好的解决方案来处理
Immutable.js
和 TypeScript
?
- 有人推荐更好的library/solution,以获得良好的不变性和类型安全性吗?
待更新:
最终,经过一些基准测试和 facebook-groups 讨论,我们转换为 immer
,我们不想回头看。很好的解决方案 - 类型化、简单、对象是原生的,因此无需学习新的 api...我们很高兴。
我们在 Immutable.js
与 TypeScript
结合时遇到问题,感谢您的意见:
在过去的一年里,我们正在开发一个 react-redux 应用程序。
正如几乎所有最佳实践、常识和 redux docs 中所推荐的,我们的商店数据是不可变的。
正如上面 redux 文档中所推荐的那样,正如在许多大项目中所使用的那样,以及许多正在实施的样板文件中,我们正在使用 Immutable.js
。
我们也在 TypeScript
中编写我们的应用程序。
问题是,这两个(Immutable.js
和TypeScript
)不能很好地发挥。一旦使用 toJS
或 get
或 getIn
将不可变对象转换为普通 JS 对象,类型将更改为 any
,这打破了存储和组件。
我们试过了
- 演员:
state.users.getIn(['counts', visits]) as number
但我们希望有更好的类型安全。
- 修复
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
的类型安全。*
- 原版:
我们尝试使用普通的对象传播,但随着数据结构变得复杂,不可变对象的合并变得过于复杂并生成了不可读的代码:
{
...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 应用程序的人:
- 有没有人遇到同样的问题?有一个很好的解决方案来处理
Immutable.js
和TypeScript
? - 有人推荐更好的library/solution,以获得良好的不变性和类型安全性吗?
待更新:
最终,经过一些基准测试和 facebook-groups 讨论,我们转换为 immer
,我们不想回头看。很好的解决方案 - 类型化、简单、对象是原生的,因此无需学习新的 api...我们很高兴。