流程:使用fromJS()来检查复杂的不可变形状?

时间:2017-02-23 08:41:23

标签: javascript immutable.js flowtype

如何使用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方面,似乎有两个主要的并发症:

  1. 似乎Immutable.js的fromJS方法返回anyhttps://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
    
  2. 似乎无法使用How to describe Immutable.js Map shape with Flow的类似对象的符号来描述地图形状(或者此信息是否已过时?)。

  3. 我真的很困惑如何让Flow了解Immutable.js,特别是地图。据我所知,当数据存在于Immutable.js结构而不是普通的JS原语中时,Flow会丢失很多关于代码库的信息。

1 个答案:

答案 0 :(得分:2)

编辑2018-05-14:尚未发布的版本4.0的immutable-js完全支持这一点。创建记录时,它将从传递给它的对象推断其类型,或者您可以手动将工厂键入Record<TProps>。截至目前的最新版本是4.0.0-rc.9,但该项目已经comatose大约六个月了,所以你可能只想了解已知的bug(以避免它们,或者自定义构建,修复它们并使用RC。

理论上你必须使用Record()来编码预期的形状,然后然后添加类型检查......

除了静态输入这个immutable-js结构的实际成员之外,遗憾的是不可能,因为certain features缺少流程。

目前有一对拉请求(firstsecond)可以向typechecker添加必要的功能,但它们相当复杂,审核和集成它们的过程似乎是在Facebook内部进行。

我怀疑只要合并它们,编码新热点的流式类型定义几乎会立即启动,即使immutable-js项目没有快速集成它们。

注意:如果您想提供反馈,请不要留下“+1”或“何时完成评论”;那些存储库不被接受的样式。请改用反应/投票功能。