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

Evg*_*eny 6 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
Run Code Online (Sandbox Code Playgroud)

根据Node的文档,我很确定该方法存在.我真的不想分叉Flow项目来修复这么小的东西.

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

Evg*_*eny 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

每个地方都Buffer | String被替换为包括在内Object

/flow-typed/node.js文件在项目的版本控制中进行管理。但是,一旦较新版本的Flow支持Node.js中的其他语法,则可以删除此声明。同时,它解决了由于Flow落后于Node.js及其普遍不正确性而导致的Flow错误。