使可分发的流式类型包具有第三方类型依赖性

问题描述 投票:0回答:1

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

flowtype flow-typed
1个回答
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;

这解决了原始问题,因为第三方依赖关系现在已经被有效封装,并且没有到达暴露接口之外。

© www.soinside.com 2019 - 2024. All rights reserved.