如何扩展flow-bin以支持新的Node.js方法?

时间:2018-01-02 14:47:41

标签: node.js flowtype

当工具报告错误时,有没有办法解决flow-bin的错误,实际上这是flow本身的错误?

例如,使用Flow v0.62和Node.js Buffer#swap64方法:

Error: lib/index.js:88                                                                                           
 88:         int64buf.swap64() // turn into Little-Endian
                      ^^^^^^ property `swap64`. Property not found in                     
 88:         int64buf.swap64() // turn into Little-Endian
             ^^^^^^^^ Buffer

根据Node的文档,我很确定该方法存在。我并不是真的想要解决Flow项目只是为了解决这么小的问题。

在等待Facebook接受拉取请求时是否有解决方法?

1 个答案:

答案 0 :(得分:4)

找到一个解决方案,允许我覆盖Node.js包含的声明Flow在内部使用。

Flow允许使用$projectRoot/flow-typed文件夹来包含类型的自定义声明,这通常用于包含常见npm库的声明。

同样的文件夹也可以用来覆盖Flow内部为其Node.js标准库使用的一些类型。

我必须创建一个名为$projectRoot/flow-typed/node.js的文件,并在此文件中复制https://github.com/facebook/flow/blob/master/lib/node.js的整个部分。复制部分部分不起作用,因为此时Flow不支持扩展声明的类型(https://github.com/facebook/flow/issues/396。)

例如,获取Transform流并将objectMode类型参数添加到其_transform方法中。看起来像这样 -

declare class stream$Transform extends stream$Duplex {
  _transform(
    chunk: Buffer | string | Object,
    encoding: string,
    callback: (error: ?Error, data?: Buffer | string | Object) => void
  ): void;
  _flush(
    callback: (error: ?Error) => void
  ): void;
}

其中每个Buffer | String都被替换为包含Object

/flow-typed/node.js文件在项目的版本控制中进行管理。但是,一旦较新版本的Flow支持Node.js中的额外语法,就可以删除此声明。同时,它解决了Flow流量滞后于Node.js及其一般错误导致的错误。