我有一个使用Flow类型的库。它还具有依赖关系,其界面的一部分包括该库的flow-typed
文件中的类型定义。我正在使用flow-copy-source
来确保已安装的软件包中存在.js.flow
文件。
我遇到的问题是,当此库的使用者导入我的模块时,也会导入从依赖项导入的类型,但消费者现在必须为该依赖项安装自己的flow-typed
定义副本。通常情况下这很好,但如果消费代码本身具有不同版本的依赖关系,则无法避免冲突定义。
具体来说,我的库是使用[email protected]
的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
定义,那么如何制作具有全局类型依赖关系的可分发的流式类型包,这些包可以被其他流项目安全地使用?
我将此方法作为手动解决方法,直到我听到更自动的方式来执行此操作:
/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;
这解决了原始问题,因为第三方依赖关系现在已经被有效封装,并且没有到达暴露接口之外。