2017-05-15 27 views
3

在TypeScript中有一種方法允許一個文件訪問另一個文件中的方法,但不能使它們全局可訪問嗎?Typescript包裝範圍的等價物?

這個用例有一個很大的類,有一些私有方法是危險的,不應公開公開地暴露在代碼庫的任何地方。我希望能夠編寫在另一個文件中訪問它們的方法,以便在邏輯上對它們進行分組,而不必將它們都放在一個巨大的類中。

理想情況下,像Java的包範圍這樣的東西會讓我聲明這兩個文件可以訪問彼此的危險方法,而不是其他任何人。是否有任何TypeScript語言功能允許這樣做?

實施例:

類A有方法d1通過d100是所有危險,並且不應當是全局訪問。

B類方法有s1s100,這些方法對於項目中的公共消費是安全的。在做一些安全檢查之後,每個s方法都會調用d方法。 B類需要訪問所有d方法。

C類想調用s方法中的任何一種,並且應該能夠但不應該能夠調用任何d方法。

但是,據我瞭解Typescript,如果我導出任何d方法,以便B可以調用它們,那麼它們也可以被C訪問。如果這是Java,我會將A和B放在同一個包中,並使d方法包範圍。

在TypeScript中似乎沒有任何與此類似的東西,但是有沒有什麼能夠模擬1)能夠打破功能來分離文件,但2)限制誰可以調用方法的目標?

(是的,我知道一旦它編譯成Java腳本全盤皆輸。我們的目標是隻使用打字稿作爲靜態檢查在編譯時間來驗證合同。)

+0

爲什麼不把'A'類放在與'B'類相同的文件中,並且不要導出A? – Rob

+2

@Rob現在就是這樣。這兩個類都變得越來越大,最簡單的重構將它們分成兩個文件。 – Hober

+0

醜陋的部分解決方法,使用'/ ** @internal ** /'來隱藏'.d.ts'文件中的內容。似乎還沒有任何好的方法來做到這一點,雖然有[開放提議](https://github.com/Microsoft/TypeScript/issues/5228) – Gerrit0

回答

2

在Typescript中沒有直接的方法來執行此操作。根據我的經驗,解決這類問題的最好方法是通過明確的文檔和明確的命名模式。

如果有一個不熟練的或惡意的開發者,他們將有許多方式來製造混亂和編譯器限制,但對於阻止他們沒有多大作用。但是,所有具有合理技能和道德的開發人員都應該能夠避免調用內部危險的方法。

我的建議是生成某種命名約定。由於語言限制而公開的所有非API方法/屬性/字段應該具有相同的前綴或後綴。

例如,我們的團隊的工作方式如下:

  1. 所有非公開的API方法/屬性/字段與_前綴。
  2. 所有非API公共類的後綴爲Internal
  3. 所有非API模塊都位於internal文件夾中。例如 - src/models具有API模型模塊。 src/models/internal具有不是API的模型模塊。
  4. 所有非API類都有一個註釋,它們將它們記錄爲非API。

此外,我們還沒有這樣做,但正在考慮創建tslint規則來幫助執行這些規則。我們還沒有走得太遠,因爲我們還沒有任何開發者意外地使用非API,但這仍然是可能的。

在我看來,正確的命名約定,適當的文檔和適當的指導就足以解決這個問題,我同意這是Stylmarks語言的限制。

+0

我認爲主要問題是開發人員沒有意識到他們正在進入他們不應該去的地方。也許最簡單的解決方案就是在每個外部可訪問的應該限制範圍的標識符前加上'_'。該前綴告訴開發者他們需要在使用前仔細檢查預期的範圍。 –

0

我會隱藏危險方法使用Rob提出的方法:將類A放在與類B相同的文件中。導出類B,但不要導出類A.這樣,類A只對類B可見。當然,作爲替代,您可以創建一個巨大的類,但你是正確的路徑猶豫不決...

你應該小心,雖然:TypeScript編譯爲JavaScript,因此每一個不安全的代碼可用於JavaScript的不受歡迎的用法透視。