如何让 Flow 理解为 Node.js 编写的代码?

How to make Flow understand code written for Node.js?

我刚刚开始使用 Flow,试图将其引入现有的 Node 代码库。

这里有两行 Flow 抱怨:

import Module from 'module';

const nodeVersion = Number(process.versions.node.split('.')[0]);

关于这几行的警告分别是:

module. Required module not found

call of method `split`. Method cannot be called on possibly null value

所以看起来 Flow 并不知道一些在 Node 环境中是标准的东西(例如 process.versions.node 保证是一个字符串,并且有 definitely 一个名为 module).

的内置节点

但是话又说回来,Flow 的 configuration docs 建议它默认是节点感知的。我还有很多其他东西,比如 import fs from 'fs'; 不会 引起任何警告。那我做错了什么?

模块 fs 按预期工作,因为 Flow 带有内置定义,请参阅 declare module "fs" 此处:https://github.com/facebook/flow/blob/master/lib/node.js#L624

关于process.versions.node,您可以在同一个文件中看到versions 键被键入为可为空字符串的映射,没有提及具体的node 属性:versions : { [key: string] : ?string };。所以你需要做一个 PR 来改进这个定义,或者调整你的代码以适应该值是否为 null 的可能性。

我想关于模块 "module" 的答案现在很明显了——在 lib/node.js 的 Flow 中没有针对该模块的内置定义。您可以编写自己的定义,并可选择将它们与 PR 一起发送给 Flow 团队。您也可以尝试在 github 中搜索这些,可能有人已经完成了这项工作。

那个 lib 目录非常有用,它有 DOM 和其他内容的流定义。