2013-04-02 62 views
90

雖然與打字稿涉足,我意識到模塊中我的課(用作命名空間)並不適用於其他類,除非我之前寫的export關鍵字,如:爲什麼Typescript使用關鍵字「export」來公開類和接口?

module some.namespace.here 
{ 
    export class SomeClass{..} 
} 

所以,現在我可以用上面的代碼像這樣:

var someVar = new some.namespace.here.SomeClass(); 

不過,我只是想知道,爲什麼這個關鍵字用於而不是僅使用該工具用於在方法層面,以表示一個方法或屬性應該是從外部訪問的public關鍵字。那麼爲什麼不使用這個相同的機制來使類和接口等在外部可見?

module some.namespace.here 
{ 
    public class SomeClass{..} 
} 

回答

118

的主要原因是export爲ECMAScript的計劃相符:像

這將使最終的代碼。你可能會爭辯說,「他們應該使用」導出「而不是」公開「,但是」export/private/protected「是一組訪問調整不完善的匹配修飾符,我相信兩者之間存在細微的差別, 。

在打字稿,標誌着一類成員爲publicprivate對生成的JavaScript沒有效果。這是一個簡單的設計/編譯時間的工具,可以用來阻止你的打字稿代碼訪問的東西它不應該。

隨着export關鍵字時,JavaScript添加一行將導出的項目添加到模塊在您的例子:。here.SomeClass = SomeClass;

因此,從概念上講,由publicprivate控制的可見性僅用於加工,而export關鍵字用於更改輸出。

+1

感謝您提供的信息,我認爲您的決定與您說的一樣,以避免檢查關鍵字的上下文,這是一種恥辱,因爲它感覺就像它會讓幾個人絆倒一樣,並且確實沒有邏輯行爲方面的差異與您期望公衆採取行動的差異,只是使其實施更容易。 – Grofit

+0

感謝您的支持。爲我挽回頭髮。 –

38

有幾件事情要添加到史蒂夫芬頓的回答是:

  • export已經意味着兩個不同的東西(這取決於它是否在頂層或沒有);使其意味着第三個可能比添加更差public/private
  • 這絕對不是使執行更容易; publicexport增加的複雜性是微不足道的。我們已經改變了關鍵詞,這並不困難。
  • 爲了與ES6課程建議保持一致,課程成員的默認知名度必須爲,因此我們需要一些關鍵字來表示「不公開」。 exportunexport ??)沒有合適的反義詞,所以private是合乎邏輯的選擇。一旦你有private,這將是有點瘋狂的不選擇public作爲其相對
  • 使用export修改內部模塊的知名度與ES6模塊
+1

感謝您提供更多信息,我完全同意會員級別的公共/私人會員,我只是覺得奇怪,並不足以滿足所有級別的訪問。不過,這是個人觀點,關鍵字是關鍵字,只是想了解更多信息。 – Grofit

+3

我修改了我關於易用性的厚顏無恥的聲明,並提供+1作爲道歉:) – Fenton

+0

我對第一個問題感到困惑。誰在暗示「出口」應該有第三個含義? – gravidThoughts

-4

實際上,它是一個節點的最佳猜測對齊。 js兼容性。

如果你看一下transpiled代碼:

export function foo(){ 
} 

你:

function foo(){ 
} 
exports.foo = foo; 

這是節點的語法。

+4

這與Node無關。現有的兩個答案,其中一個是由語言設計師之一發布的,現在已經出現。 – Stijn

+1

看起來你在回答之前還沒有研究過任何東西... – WilomGfx

+0

是的,我應該研究更多。我可以刪除這個答案嗎?我沒有看到任何明顯的方式在UI中做到這一點。 – Eugene

相關問題