【问题标题】:How to extend flow-bin to support new Node.js methods?如何扩展 flow-bin 以支持新的 Node.js 方法?
【发布时间】:2018-06-12 06:43:09
【问题描述】:

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

例如,使用 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 接受拉取请求时是否有解决方法?

【问题讨论】:

标签: node.js flowtype


【解决方案1】:

找到了一个解决方案,允许我覆盖 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 中由于 Flow 落后于 Node.js 及其普遍不正确而导致的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2011-02-24
    • 2013-07-03
    • 2010-12-04
    相关资源
    最近更新 更多