如何使用Flow来检查从fromJS
生成的Immutable.JS数据结构的形状?可以使用对象文字表示法非常准确地键入普通的旧JS blob:
type ObjectShape = {
a: number,
b: string,
c: {
d: number,
},
e: Array<number>
};
const obj: ObjectShape = { // hyper-accurate
a: 1,
b: '2',
c: {
d: 3,
},
e: [4]
}
然而,在Immutable.js方面,似乎有两个主要的并发症:
似乎Immutable.js的fromJS
方法返回any
(https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow#L764),因此以下内容不会被捕获为Flow中的错误:
const map: boolean = fromJS(obj) // this is totally not true, but Flow can't tell
似乎无法使用How to describe Immutable.js Map shape with Flow的类似对象的符号来描述地图形状(或者此信息是否已过时?)。
我真的很困惑如何让Flow了解Immutable.js,特别是地图。据我所知,当数据存在于Immutable.js结构而不是普通的JS原语中时,Flow会丢失很多关于代码库的信息。
答案 0 :(得分:2)
编辑2018-05-14:尚未发布的版本4.0的immutable-js完全支持这一点。创建记录时,它将从传递给它的对象推断其类型,或者您可以手动将工厂键入Record<TProps>
。截至目前的最新版本是4.0.0-rc.9,但该项目已经comatose大约六个月了,所以你可能只想了解已知的bug(以避免它们,或者自定义构建,修复它们并使用RC。
理论上你必须使用Record()来编码预期的形状,然后然后添加类型检查......
除了静态输入这个immutable-js结构的实际成员之外,遗憾的是不可能,因为certain features缺少流程。
目前有一对拉请求(first,second)可以向typechecker添加必要的功能,但它们相当复杂,审核和集成它们的过程似乎是在Facebook内部进行。
我怀疑只要合并它们,编码新热点的流式类型定义几乎会立即启动,即使immutable-js项目没有快速集成它们。
注意:如果您想提供反馈,请不要留下“+1”或“何时完成评论”;那些存储库不被接受的样式。请改用反应/投票功能。