node_modules/* 中的流类型检查器错误

Flow type checker errors in node_modules/*

我在新 https://github.com/davezuko/react-redux-starter-kit 项目中用 flow init 初始化了流程项目。

当 Flow 检查时,它在 node_modules 中发现了几个错误。 /* 流 */ 带注释的库文件中发生错误。

看起来像这样:

node_modules/editions/source/index.js:33
 33:    const {name, editions} = require(packagePath)
                                 ^^^^^^^^^^^^^^^^^^^^ The parameter passed to require() must be a literal string.

node_modules/fbjs/lib/Deferred.js.flow:60
 60:     Promise.prototype.done.apply(this._promise, arguments);
                           ^^^^ property `done`. Property not found in
474: declare class Promise<+R> {
     ^ Promise. See lib: /private/tmp/flow/flowlib_d34ebcf/core.js:474

node_modules/fbjs/lib/shallowEqual.js.flow:29
 29:     return x !== 0 || 1 / (x: $FlowIssue) === 1 / (y: $FlowIssue);
                               ^^^^^^^^^^ identifier `$FlowIssue`.     Could not resolve name

我应该让 Flow 忽略这些文件吗?我认为它可能会影响类型检查的正确性。

fbjs和版本都是用Flow写的。他们每个人都有 .flowconfig 个配置各异的文件。您看到的所有错误都是由于您的 .flowconfig 配置略有不同。

最简单的解决方法是修改 .flowconfig 以支持 edition 和 fbjs 使用的内容。

  1. module.ignore_non_literal_requires=true 添加到 [options] 部分应该可以修复第一个错误。默认情况下,如果您将变量传递给 require(),Flow 将出错,因为 Flow 想要了解依赖关系图。此选项放宽了此要求。
  2. ./node_modules/fbjs/flow/lib 添加到 [libs] 部分应该可以修复第二个错误。 fbjs 使用 Promise 的非标准版本,但它确实附带了 Promise.
  3. 版本的库定义
  4. suppress_type=$FlowIssue 添加到 [options] 部分应该可以修复第三个错误。此选项只是将 any 类型别名为 $FlowIssue。当您使用 any 来抑制错误时,它会更清楚。

未来,Flow 团队设想 Flow 用户会选择完全忽略 node_modules/,而是依赖 https://github.com/flowtype/flow-typed/ 中的库定义,因此我们正在围绕 Flow 投资定义和工具-打字。这将避免您 运行 遇到的那种情况。

我个人喜欢通过这样做忽略 node_modules 下的所有内容。

[ignore]
.*/node_modules/.*

然后我使用流式安装或存根所有导入 https://github.com/flowtype/flow-typed