2017-08-22 64 views
3

考慮以下打字稿:如何引用在同名的當前名稱空間之外聲明的名稱空間?

export namespace Test { 
    export const test = "test"; 
} 
export namespace Wrapper { 
    export namespace Test { 
     export const value = Test.test; // "<script>".Wrapper.Test has no exported member 'test'. 
    } 
} 

由於打字稿編譯成JavaScript的TestWrapper第二個聲明將創建一個新的範圍,其中Test將僅涉及其本身的方式。至少根據TypeScript類型檢查器,頂級Test在該範圍內不可用。

我從另一種語言生成TypeScript,其中這種名稱空間衝突沒有什麼大不了的。但在TypeScript中,它會導致編譯錯誤。該應用程序仍然運行,所以這似乎是一個TypeScript類型檢查問題,而不是一個真正的JavaScript運行時問題。

TypeScript中是否有任何已知的解決方法?

我已經在Gluon issue中設置了repro。

回答

1

您可以創建一個別名,克服了命名空間衝突:

export namespace Test { 
    export const test = "test"; 
} 

import _Test = Test; 

export namespace Wrapper { 
    export namespace Test { 
     export const value = _Test.test; 
    } 
} 
+0

謝謝你,比爾。我想我也可以編碼這個,但是這應該是一個類型檢查問題嗎?它在運行時似乎是有效的JavaScript。 – panesofglass

+0

'namespace'是一個TypeScript(不是JavaScript)構造。它編譯成函數包裝器。繼續編譯它,看看實際的JavaScript是什麼樣的。你會發現JS實際上看起來很像上面的,事實上它們有相同的命名問題。 –

+0

看來TypeScript團隊已經意識到了這個問題 - 請參閱Anders Hejlsberg提交的[引入全球範圍參考的拒絕功能請求](https://github.com/Microsoft/TypeScript/issues/983) –

相關問題