【问题标题】:Commonjs library's index.ts as external moduleCommonjs 库的 index.ts 作为外部模块
【发布时间】:2016-12-20 12:08:43
【问题描述】:

我需要一些指导来正确开发可重用的 commonjs 库(npm 包)。 假设库结构如下:

—lib
——Helper.ts
——Serialization.ts
——meta
——— Entity.ts
—index.ts

等等。每个文件都是外部模块。

现在我需要创建一个入口文件(比如 index.ts),它将公开库的功能并用作入口点。 在这里,我无法理解创建它的方式。我想通过导出所有内容来保留嵌套结构而不使其变平:

export * from './lib/Helper’;
export * from './lib/Serialization’;
export * from './lib/meta/Entity’;
…

因为这将删除逻辑分组,并可能在将来导致可能的名称冲突

我也尝试过这样的 index.ts:

import {Helper} from './lib/Helper';
import * as Serialization from './lib/Serialization';
import * as Decorators from './lib/meta/Decorators';

let core = {
    Helper: Helper,
    Serialization: Serialization,
    Meta: {
        Entity: Entity,
    }
}

export default core;

在我开始使用这样的导入类型之前,它可以完美运行:

import Core from ’nameOfTheNpmPackage';

let Entity = Core.Meta.Entity;

function f(e: Entity)//<—This produce error cannot find name ‘Entity'
{

}

因为它们不在类型声明空间中(如果它们不在命名空间中,有没有办法复制它们?)

我尝试过的另一个选项是使用 outFile + amd 为整个库生成单个 d.ts 文件。但该文件不是外部模块。

所以我的问题是 - 如何编写 index.ts 使其成为外部模块并导出库公开的所有功能。

提前致谢。

【问题讨论】:

    标签: typescript npm commonjs


    【解决方案1】:

    浪费了一天的时间,我想出了一个丑陋的解决方案。 为了保持导出的 commonjs 库的嵌套结构,您必须在每个“级别”内放置自己的 index.ts,这将聚合并重新导出同一“级别”的所有功能。对于我上面的示例,它看起来像:

    —lib ——Helper.ts ——Serialization.ts ——meta ——— index.ts ——— Entity.ts —index.ts

    在哪里根 index.ts:

    export * from './lib/Helper';
    export * from './lib/Serialization';
    
    import * as S from './lib/Serialization'; //This is case where one file contains several exported classes that we want to keen as separate module
    export {S as Serialization};
    
    import * as Meta from './lib/meta/index';
    export {Meta};
    

    还有 meta/index.ts:

    export * from './Entity';
    

    我真的很高兴知道这个常见的(?)任务是否可以在没有每个“级别”的额外文件的情况下解决。

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 2013-07-13
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2012-06-04
      • 2012-12-07
      相关资源
      最近更新 更多