来自immutable.js的Iterable的flowtype定义打破了其他libs' Iterables

时间:2016-10-22 21:45:05

标签: react-native immutable.js flowtype

我刚刚将immutable.js添加为我的项目的依赖项。我添加了

node_modules/immutable/dist/immutable.js.flow

到我的.flowconfig

问题在于,不可变导出Iterable类型,这也是node_modules/中许多其他库中使用的全局类型,例如fbjsreact-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,错误消失了。

在不必手动编辑不可变定义的情况下解决此问题的最佳方法是什么?

1 个答案:

答案 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显示,因此也可能有所帮助!