Commonjs库的index.ts作为外部模块

时间:2016-08-13 18:04:25

标签: typescript npm commonjs

我需要一些指导来正确开发可重用的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使它成为外部模块并导出库所公开的所有功能。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

root 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';

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