我刚刚将immutable.js添加为我的项目的依赖项。我添加了
node_modules/immutable/dist/immutable.js.flow
到我的.flowconfig
。
问题在于,不可变导出Iterable
类型,这也是node_modules/
中许多其他库中使用的全局类型,例如fbjs
和react-native
。例如,以下错误之一。
node_modules/fbjs/lib/countDistinct.js.flow:22
22: function countDistinct<T1, T2>(iter: Iterable<T1>, selector: (item: T1) => T2): number {
^^^^^^^^^^^^ type application of identifier `Iterable`. Too few type arguments. Expected at least 2
32: declare class Iterable<K, V> extends _ImmutableIterable<K, V, typeof KeyedIterable, typeof IndexedIterable, typeof SetIterable> {}
^^^^ See type parameters of definition here. See lib: flow/immutable.js:32
为了解决此问题,我将immutable.js.flow
复制到了我的项目,并删除了包含它的.flowconfig
行。在我复制的文件中,我将Iterable重命名为WhateverIterable,错误消失了。
在不必手动编辑不可变定义的情况下解决此问题的最佳方法是什么?
答案 0 :(得分:1)
主要问题是node_modules/immutable/dist/immutable.js.flow
没有写成库定义,因此将其用作一个可能会导致错误。
immutable.js.flow
docs将这些文件称为声明文件。 immutable.js.flow
位于名为immutable.js
的文件旁边。每当要求Flow要求immutable.js
时,它将转换为immutable.js.flow
。您可以使用flow find-module
命令对此进行测试,该命令显示当foo.js
导入immutable
时,Flow将解析为哪个文件:
$ flow find-module immutable foo.js
/Users/glevi/test/immutable/node_modules/immutable/dist/immutable.js.flow
声明文件的编写方式与libdefs略有不同。库定义声明了一堆全局事物。它们声明了全局可用的变量,函数,类型,类,模块等,并声明这些事物的类型。声明文件仅声明它们正在隐藏的模块的类型。
immutablejs的libdef看起来像
declare module 'immutable' {
declare class Iterable<K,V> { ... }
...
}
虽然immutable.js.flow
可能看起来像
declare export class Iterable<K,V> { ... }
理论上,您不需要将node_modules/immutable/dist/immutable.js.flow
添加到.flowconfig
。只要您的代码导入immutable
,就会自动使用它。
如果不可变的immutable.js.flow
出现问题,那么最好的办法是针对immutable.js.flow打开拉取请求或问题,或者向{{3}提交libdef }。
快速搜索会向某人flow-typed显示,因此也可能有所帮助!