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;
}
(来自here的想法)
假设只用getIn
调用toJS
并且总是返回一个JS对象(我们有时会在higher-order-component中这样做 - 但这是另一个故事)。
但这是垃圾和大黑客。
我们得出的结论是,不可能自己修复Immutable.js
的类型安全性。*
我们尝试使用对象扩展来使用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应用程序创建/使用的人员:
Immutable.js
和TypeScript
?答案 0 :(得分:1)
更新:
最终,经过一些基准测试和facebook-groups讨论后,我们转换为immer
,我们不想回头看。伟大的解决方案 - 打字,简单,对象是原生的,所以不需要学习新的api ...我们很高兴。