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

时间:2016-07-06 13:42:05

标签: javascript flowtype

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

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

看起来像这样:

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忽略这些文件吗?我认为它可能会影响类型检查的正确性。

2 个答案:

答案 0 :(得分:29)

fbj和版本都是使用Flow编写的。它们每个都有.flowconfig个文件,各种配置。您看到的所有错误都是由于.flowconfig的配置略有不同。

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

  1. module.ignore_non_literal_requires=true添加到[options]部分应修复第一个错误。默认情况下,如果将变量传递给require(),则Flow会出错,因为Flow想要了解依赖关系图。此选项可以放宽此要求。
  2. ./node_modules/fbjs/flow/lib添加到[libs]部分应修复第二个错误。 fbjs使用非标准版本的Promise,但它附带了该Promise版本的库定义。
  3. suppress_type=$FlowIssue添加到[options]部分应修复第三个错误。此选项只会将any类型别名为$FlowIssue。当您使用any来抑制错误时,它会更清晰。
  4. 将来,Flow团队会想象Flow用户会选择完全忽略node_modules/,而是依赖https://github.com/flowtype/flow-typed/中的库定义,因此我们会围绕流程投资定义和工具-typed。这样可以避免您遇到的那种情况。

答案 1 :(得分:3)

我个人喜欢忽略node_modules下的所有内容。

[ignore]
.*/node_modules/.*

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