2017-02-23 34 views
12

如何使用Flow类型检查从fromJS生成的Immutable.JS数据结构的形状?普通的老JS斑点可以非常精确地使用对象的文字符号中键入:流:使用fromJS()类型化复杂的不可变形状?

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. 看来,永恒.js文件的fromJS方法返回anyhttps://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 
    
  2. 看来,地图形状不能用每个How to describe Immutable.js Map shape with Flow(或者这个信息是过时的?)的类似对象的符号来描述。

我真的很困惑如何让Flow理解Immutable.js,特别是地图。从我所知道的情况来看,当数据位于Immutable.js结构中而不是普通的JS基元时,Flow会失去很多关于代码库的情报。

+0

https://github.com/flowtype/flow-typed,你可以加载地图类型定义 –

+0

流式类型没有immutabe.js的定义,它们直接包含在immutable.js中来自npm的包。然而,immutable.js中包含的Map定义现在看起来并不允许您定义形状:https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow# L489 –

回答

0

您在理论上必须使用记录(),它编码的预期形状和然后添加类型检查...

除了静态输入实际成员这一不可改变的js结构的会不会黯然有可能,因为certainfeatures缺乏流量。

目前有一对拉请求(first,second)开放给typechecker添加必要的功能,但他们相当参与,审查和整合它们的过程似乎在Facebook内部进行。

我怀疑,只要这些合并,即使immutable-js项目没有尽快整合它们,编码新hotness的流类型定义也会立即启动。

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

+1

我看到PR现在已关闭。如何做到这一点的任何例子,如果现在可能? –

+1

除了这些PR之外,流程员们得到的解决方案是添加一个* new *类型的函数,$ ElementType,它具有必要的功能。见例如https://flow.org/try/#0C4TwDgpgBA0hJQLxQOQGt4oNwChSSgBUkoBvKDEALigDsBXAWwCMIAnKAX1wBMIBjADYBDNtABuoqGDYB7MDQAkAUUERGEWsELgIAHkIAaOCAB8uIA – azernik