flowjs中的奇怪错误消息“库定义的使用不一致”

时间:2016-10-22 12:50:03

标签: flowtype

我一直在使用flowjs并且大多数错误信息非常清楚,但现在我有这样的事情:

src/framework/uitable/show.js:0
inconsistent use of library definitions
 46:    columns: Array<UiTableConfigColumnType>
                       ^^^^^^^^^^^^^^^^^^^^^^^ object type. This type is incompatible with. See lib: src/framework/uitable/uitable.js.flow:46
 52: type UiTableDataColsType = Array<string>;
                                      ^^^^^^ string. See lib: src/framework/uitable/uitable.js.flow:52

src/framework/uitable/show.js:0
inconsistent use of library definitions
 52: type UiTableDataColsType = Array<string>;
                                      ^^^^^^ string. This type is incompatible with. See lib: src/framework/uitable/uitable.js.flow:52
 46:    columns: Array<UiTableConfigColumnType>
                       ^^^^^^^^^^^^^^^^^^^^^^^ object type. See lib: src/framework/uitable/uitable.js.flow:46

并且不知道该寻找什么。

定义中的类型似乎没问题,它们彼此无关,而源指向第0行。

之前我从未见过这个错误,我不希望有任何帮助来追踪这个错误的实际来源。

我只需要帮助理解错误本身的含义以及为什么flowjs会在第0行报告错误src/framework/uitable/show.js:0

1 个答案:

答案 0 :(得分:10)

inconsistent use of library definitions是什么意思?

当类型A流向类型B时,会发生大多数流错误。例如,如果您调用的函数需要类型为B的参数,但您将其传递给类型为A的函数。发生这种情况时,Flow会输出有关类型A与类型B不兼容的错误。

有时,你有像

这样的代码
// in file foo.js
libraryCallB(libraryCallA());

在这种情况下,libraryCallA()的返回类型可能与libraryCallB()的参数类型不匹配。因此Flow将发出类型不兼容的错误。但是,由于两个库调用都是在库中定义的(比如lib.js),因此错误消息根本不会提到foo.js。这不是理想的,因为错误可能在foo.js:0

所以,作为一个绑带,我们只是将foo.js:0放在错误的顶部作为提示。这意味着当我们注意到一个库类型流入不兼容的库类型时,我们正在进行类型检查foo.js

我们一直在尝试改进错误消息,因此这些错误应该不那么普遍。但他们仍然会发生。

你的代码怎么样?

  • 错误可能发生在src/framework/uitable/show.js
  • 尝试flow check --traces 10它运行正常flow check,但保存这些&#34;跟踪&#34;,这有点像Flow的内部类型检查逻辑的堆栈跟踪。 10表示打印深度为10的记录。输出很难理解,除非您熟悉Flow的内部结构,但可能会提到src/framework/uitable/show.js中触发错误的位置
  • 我猜这个错误与Array<string>被用作Array<UiTableConfigColumnType>有关,反之亦然。