我需要一些指导来正确开发可重用的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使它成为外部模块并导出库所公开的所有功能。
提前致谢。
答案 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';
我很高兴知道这个常见的(?)任务是否可以在没有额外文件的情况下解决。