【问题标题】:Making distributable flow-typed packages with third-party type dependencies制作具有第三方类型依赖项的可分发流类型包
【发布时间】:2019-02-18 11:08:35
【问题描述】:

我有一个使用流类型的库。它还有一个依赖项,它的部分接口包括来自该库的flow-typed 文件的类型定义。我使用flow-copy-source 来确保已安装的包中存在.js.flow 文件。

我遇到的问题是,当这个库的使用者导入我的模块时,从依赖项中导入的类型也会被导入,但是现在使用者必须为该依赖项安装自己的 flow-typed 定义副本.通常这没问题,但如果该消费代码具有该依赖项本身的不同版本,则无法避免定义冲突。

具体来说,我的库是一个使用 axios@0.18.x 的 HTTP 服务包装器,并且具有如下导入:

import type { Axios, AxiosXHRConfig } from 'axios';

flow-typed 定义的0.18.x 版本中的AxiosXHRConfig 采用两个类型参数。与此同时,消费 应用程序正在使用旧版本的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】:

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

    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;
    

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

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多