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

Jon*_*rsi 14 javascript flowtype immutable.js

你如何检查fromJS使用Flow 生成的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]
}
Run Code Online (Sandbox Code Playgroud)

但是,在Immutable.js方面,似乎有两个主要的复杂情况:

  1. 似乎Immutable.js的fromJS方法返回any(https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow#L764),因此以下内容不会被捕获为错误流:

    const map: boolean = fromJS(obj) // this is totally not true, but Flow can't tell
    
    Run Code Online (Sandbox Code Playgroud)
  2. 似乎无法使用类似于对象的符号描述地图形状,如何使用Flow描述Immutable.js Map形状(或者这个信息是否已过时?).

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

aze*_*nik 2

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


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

遗憾的是,由于缺乏流程的某些功能,静态键入此 immutable-js 结构的实际成员是不可能的。

目前有两个拉取请求(第一个第二个)正在开放,以向类型检查器添加必要的功能,但它们相当复杂,并且审查和集成它们的过程似乎正在 Facebook 内部进行。

我怀疑一旦这些被合并,编码新热度的流类型定义几乎会立即出现,即使 immutable-js 项目没有那么快地集成它们。

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

  • 流程人员找到的解决方案不是添加这些 PR,而是添加一个具有必要功能的“新”类型函数 $ElementType。参见例如https://flow.org/try/#0C4TwDgpgBA0hJQLxQOQGt4oNwChSSgBUkoBvKDEALigDsBXAWwCMIAnKAX1wBMIBjADYBDNtABuoqGDYB7MDQAkAUUERGEWsELgIAHkIAaOCAB8uIA (3认同)