我有一个使用Flow类型的库。它还具有依赖关系,并且其接口的一部分包括该库的flow-typed
文件中的类型定义。我正在使用flow-copy-source
来确保已安装的软件包中存在.js.flow
个文件。
我遇到的问题是,当该库的使用者导入我的模块时,也会导入从依赖项导入的类型,但是使用者现在必须为其安装flow-typed
定义的副本。这种依赖性。通常,这很好,但是如果使用该代码的依赖项本身具有不同的 version 版本,则无法避免定义冲突。
具体来说,我的库是使用axios@0.18.x
的HTTP服务包装程序,并且具有如下所示的导入方式:
import type { Axios, AxiosXHRConfig } from 'axios';
AxiosXHRConfig
定义的版本0.18.x
中的 flow-typed
具有两个类型参数。同时,消费应用程序正在使用axios
的旧版本,并且该旧版本具有不同版本的axios库定义。由于这两个库定义都具有:
declare module "axios" {
// ...
}
...该库中的import type { ... } from 'axios'
不能解析为该库中的flow-typed/npm/axios_v0.18.x.js
,而不是使用应用程序的flow-typed/npm/axios_v0.17.x.js
。
在库中复制flow-typed
定义的时间很短,您如何制作具有全局类型依赖项的可分发流类型的包,这些流类型的包可以被其他流项目安全地使用?
答案 0 :(得分:0)
我将这种方法作为一种手动解决方法,直到听到一种更自动的方法为止:
/src/interface.js
流文件flow-copy-source
/src
和已转译的/lib
目录。index.js
和index.js.flow
可以消除接口实现的键入,如下所示:index.js:
module.exports = require('./lib/client').default;
index.js.flow:
// @flow
import type { FooClient as _FooClient } from './src/interface';
export type FooClient = _FooClient;
const Client: Class<FooClient> = require('./lib/client').default;
export default Client;
这解决了最初的问题,因为第三方依赖项现在已被有效地封装并且不会到达公开接口的外部。