制作具有第三方类型依赖项的可分配流类型程序包

时间:2018-09-13 16:52:54

标签: flowtype flow-typed

我有一个使用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定义的时间很短,您如何制作具有全局类型依赖项的可分发流类型的包,这些流类型的包可以被其他流项目安全地使用?

1 个答案:

答案 0 :(得分:0)

我将这种方法作为一种手动解决方法,直到听到一种更自动的方法为止:

  1. 仅使用我的图书馆的公共接口创建一个/src/interface.js流文件
  2. 让我的客户端类实现此公共接口
  3. 停止使用flow-copy-source
  4. 发布我的/src和已转译的/lib目录。
  5. 添加index.jsindex.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;

这解决了最初的问题,因为第三方依赖项现在已被有效地封装并且不会到达公开接口的外部。