2017-03-17 104 views
0

作爲名稱空間聲明的導出庫或類型導出似乎會自動污染我的代碼的名稱空間,儘管我從不導入它們。雖然從不導入名稱空間,但是定義名稱空間

例如:

import * as bar from "exa"; 

export var t2 = (a:foo.Test) => { 
    console.log(a.doSomething()); 
} 

export class Something { 
    public test(c:foo.Test) { 
     c.doSomething(); 
    } 
} 

Complete example on GitHub

我會希望發生的事情是,當我嘗試引用「富」,以得到一個錯誤,因爲我還沒有明確導入它或任何其定義。但是,這個編譯成功。

按照TypeScript 2.0 Handbook,具有出口爲命名空間申報出口的命名空間應該只有當你正在編寫一個腳本,他們定義爲「沒有進口或出口文件」可用。然而在上面的例子中,我有一個導入和兩個導出,所以我認爲它不是一個腳本?

因此,爲什麼我能夠從我的代碼中引用「foo」?

這是正在編譯打字稿2.2

回答

1

你只能引用foo位置沒有import。試圖在位置嘗試使用foo會引發錯誤。

這是因爲TS不希望強制你編寫一個import來獲取類型信息,因爲import有運行時副作用,你可能不需要。

+0

因此,導入不是必需的,例如,如果您只是想用類型來修飾函數的參數?在這種情況下,假設我要刪除「作爲名稱空間導出」聲明,那麼如果它是在「聲明模塊」範圍內導出的,我將如何在沒有導入的情況下引用Test接口? – Cameron

+0

此外:「TypeScript中模塊的一個主要特性是兩個不同的模塊永遠不會爲同一個作用域貢獻名稱,[...]模塊的使用者決定分配它的名稱」(來自https://www.typescriptlang .org/docs/handbook/namespaces-and-modules.html):這個例子可能違反了嗎? – Cameron

相關問題