2016-08-13 60 views
0

我需要一些指導來正確開發可重用的commonjs庫(npm包)。 可以說庫的結構如下:Commonjs庫的index.ts作爲外部模塊

—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’; 
… 

因爲這將刪除邏輯分組,並可以在將來導致可能的名稱衝突

我也曾嘗試進行索引。 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' 
{ 

} 

,因爲它們不是在類型聲明空間(有沒有複製他們,如果他們不是在命名空間的方式?)

我曾嘗試是產生單d.ts文件全庫的另一種選擇使用outFile + amd。但該文件不是外部模塊。

所以我的問題是 - 如何寫index.ts,以便它將是外部模塊,並導出由庫公開的所有功能。

在此先感謝。

回答

2

有一天浪費時間,我想出了醜陋的解決方案。 爲了保持導出的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}; 

和元/ index.ts:

export * from './Entity'; 

我會很高興要知道這個常見的(?)任務是否可以在沒有額外的文件級別的情況下解決。