2016-07-22 63 views
2

我正在使用webpack開發一個新項目。這是我第一次嘗試使用這個工具。如何正確使用命名空間Typescript與Wepback

自1年以來,我用typescript(for angularJS 1.5)開發,我從來沒有遇到任何與我的命名空間有關的問題。

// src/App/Core/Http/Test.ts 
export namespace App.Core.Http { 
     export class Test { 
      public attr:any; 
     } 
} 

// src/App/Bootstrap.ts 
import { App } from "./Core/Http/Test"; 
let testInstance = new App.Core.Http.Test(); 

如果我有更多文件要導入,該怎麼辦? 我無法導入多個「應用」變量,每次處理導入時我都不想導入別名。

是這樣的話,我不想,我想解決:

// src/App/Bootstrap.ts 
import { App } from "./Core/Http/Test"; 
import { App as App2 } from "./Core/Http/Test2"; // How can I import properly my namespace 
let testInstance = new App.Core.Http.Test(), 
    test2Instance = new App2.Core.Http.Test2(); 

我錯了的東西還是我惹一些有關的WebPack? 如何使用webpack與PHP一樣使用命名空間?

編輯2016/22/07於下午六時26分

我才知道,這是不可能使用的WebPack使用的命名空間。爲什麼?因爲每個.ts文件都被視爲具有其自己範圍的模塊。

模塊開發是必需的。

我發現了一個解決方案,使用模塊而不是命名空間來使我的文件調用更加清晰。

在我的情況下,我有App/Core包含Http,Service,Factory,Provider ...文件夾。在Core文件夾的根目錄下,我創建了一個index.ts文件,該文件用模塊體系結構導出所有需要的文件。讓我們來看看。

// src/App/Core/index.ts 
export module Http { 
     export { Test } from "src/App/Core/Http/Test"; 
     export { Test2 } from "src/App/Core/Http/Test2"; 
     export { Test3 } from "src/App/Core/Http/Test3"; 
} 

export module Service { 
     export { ServiceTest } from "src/App/Core/Service/ServiceTest"; 
     export { ServiceTest2 } from "src/App/Core/Service/ServiceTest2"; 
     export { ServiceTest3 } from "src/App/Core/Service/ServiceTest3"; 
} 
//src/App/Core/index.ts ----> EOF 

而在另一個文件調用導入模塊與別名核心。

// src/App/Bootstrap.ts 
import { * as Core } from "./Core"; 

let TestInstance = new Core.Http.Test(), 
    Test2Instance = new Core.Http.Test2(), 
    TestInstance = new Core.Http.Test3(); 

let ServiceTestInstance = new Core.Service.Test(), 
    ServiceTest2Instance = new Core.Service.Test2(), 
    ServiceTestInstance = new Core.Service.Test3(); 

// src/App/Bootstrap.ts ----> EOF 
+0

在您的示例中,您導出了模塊內的類,這將導致「TS1194:導出聲明​​不允許在名稱空間中」錯誤,您是如何處理的? – hillin

回答

1

我瞭解到無法使用webpack使用名稱空間。爲什麼?因爲每個.ts文件都被視爲具有其自己範圍的模塊。

模塊開發是必需的。

我發現了一個解決方案,使用模塊而不是命名空間來使我的文件調用更加清晰。

在我的情況下,我有App/Core包含Http,Service,Factory,Provider ...文件夾。在Core文件夾的根目錄下,我創建了一個index.ts文件,該文件用模塊體系結構導出所有需要的文件。

看看我的帖子我更新了它。

2

你不應該使用的命名空間和模塊在同一時間,即使你不使用的WebPack你有同樣的問題

與模塊正常的做法是乾脆直接導出類:

// src/App/Core/Http/Test.ts 
export class Test { 
    public attr:any; 
} 

// src/App/Bootstrap.ts 
import { Test } from "./Core/Http/Test"; 
let testInstance = new Test(); 

其他例子:

// src/App/Bootstrap.ts 
import { Test} from "./Core/Http/Test"; 
import { Test2 } from "./Core/Http/Test2"; 
let testInstance = new Test(), 
    test2Instance = new Test2(); 

希望這幫助:)

+0

感謝您的回覆,但我必須使用命名空間,因爲它是一個巨大的應用程序。我正在開發我的企業的新後臺。我曾經使用Gulp開發個人項目,並且我做了命名空間作品。你有沒有其他方法來完成這項工作?像創建一個特殊的模塊或concat我的ts文件到只有一個使這些作爲一個模塊,並導入它.. – Disfigure

+1

如果你不使用模塊,你可以使用命名空間就好,但與模塊名稱空間是不必要的,事實上會因爲每個模塊都在一個單獨的作用域中,所以你的獨立命名空間聲明不會合併到一起 – kruczy

+0

所以我的主要問題是由什麼引起的?我不明白。我發現這是由webpack和它的模塊系統引起的。用這種方法,我應該有一些命名衝突... – Disfigure

1

在TypeScript中,您可以使用另一種導入語句別名命名空間。這很簡單。

import { App } from "./Core/Http/Test"; 
import Test = App.Core.Http.Test; 
import { App as App2 } from "./Core/Http/Test2"; 
import Test2 = App2.Core.Http.Test2; 

在運行時,這是不超過const Test2 = App2.Core.Http.Test2;但在編譯時不同,使用import聲明帶來了所有類型的信息,太。

+0

是的,但正如我在文章中提到'如果我有更多的文件要導入。我無法導入多個「應用」變量,每次處理導入時我都不想導入別名。「但感謝您的幫助無論如何:)希望可以幫助別人 – Disfigure

+0

我明白你的意思;你正在談論PHP的行爲,其中多個文件中的相同命名空間都被合併到一個命名空間中。我的困惑來自於PHP命名空間和TypeScript命名空間之間的差異。 *可以在TypeScript中使用名稱空間,但它們的行爲與PHP的行爲不同。 – cspotcode

+0

是的我知道,在TypeScript中使用模塊時,名稱空間行爲與PHP不同,因爲在模塊中沒有數據與全局範圍共享。這就是爲什麼您必須逐個導入所有文件,因爲每個文件都是一個模塊。 – Disfigure