【问题标题】:How to make Flow understand code written for Node.js?如何让 Flow 理解为 Node.js 编写的代码?
【发布时间】:2016-09-08 16:32:02
【问题描述】:

我刚刚开始使用 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 保证是一个字符串,并且肯定有一个名为 @ 的 Node 内置函数987654325@)。

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

【问题讨论】:

    标签: flowtype


    【解决方案1】:

    模块 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 来改进这个定义,或者调整你的代码以使这个值为空的可能性。

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

    顺便说一句,lib 目录非常有用,它还包含 DOM 和其他内容的流定义。

    【讨论】:

    • 如果您懒得向 Flow 添加新定义,只想让错误消失,又不想到处添加 // $FlowFixMe 怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多