2017-08-01 66 views
0

我已經寫在打字稿的NPM包被designd用Node.js的應用程序一起工作。我在這個包裏有一些類只有內部使用的方法,儘管我不能將它們標記爲私有的,因爲它們被包中的其他組件使用。爲了解決這個問題,我不從項目中導出類,並且當我將該類的一個實例返回給調用者時,我將其轉換爲僅具有可公開訪問的方法的接口。打破打字稿NPM包成多個文件,而不會暴露內部組件

這工作得很好,但如果我想打破我的項目分成較小的文件,我怎麼能做到這一點,而無需被迫導出我的班,我的風險NPM模塊的濫用?

這裏是什麼,我試圖做一個簡單的例子:

文件:internal.ts

// Can I make this class not publicly accessible? 
export class InternalClass { 
    constructor() { 

    } 

    public sharedMethod(): void { 
     // Accessible to users of the package 
    } 

    public protectedMethod(): void { 
     // Only for use within the package 
    } 
} 

文件:external.ts

import { InternalClass } from "./internal"; 

export interface ExternalInterface { 
    sharedMethod(): void; 
    // protectedMethod is not available outside the package 
} 

export function makeInterface(): ExternalInterface { 
    return new InternalClass(); 
} 

對於如何任何想法做得很好,將不勝感激。

回答

0

我做到這一點的方法是通過控制究竟得到由故宮外殼中暴露出來。

例如,如果我的package.json看起來像這樣:

{ 
    .... 
    "main": "dist/index.js", 
    "typings": "typings/index.d.ts", 
    .... 
} 

然後在相應的index.ts我可以手動控制什麼將被暴露(導出)作爲包的一部分。

export * from "./lib/Helper"; 
export * from "./lib/Log"; 

import * as M from "./lib/Maps"; 
export {M as Maps}; 

如果我有模塊/我不希望訪問「外部」類 - 我根本就沒有將其導出爲index.ts或其引用部分兒童。這並不禁止我在內部導入和使用它在同一個包中。

+0

感謝。這看起來應該是訣竅。當我能夠嘗試實現這一點時,我會再次發表評論。 – Baudzilla

+0

當我嘗試這種做法,我覺得我還需要包括來自內部的東西分型的文件,因爲index.d.ts本身不包含這些類型,而不是引用的其他分型的文件。因此,用戶可以通過直接引用文件來導入內部類型。例如: '進口{} InternalClass從「我的新公共管理模塊/ internal.d.ts」' – Baudzilla

+0

我能夠通過拆分我所有的代碼放到公共/私人文件,以解決這個問題,只包括公共類型定義文件在NPM包中。由於類型定義文件未包含在私有文件中,因此無法在TypeScript中導入這些文件。不完全密封,但比將所有代碼放在單個文件中更好。 – Baudzilla