2016-07-22 10 views
2

Ich arbeite an einem neuen Projekt mit Webpack. Dies ist mein erster Versuch mit diesem Tool.Namespace Typescript richtig mit Wepback verwenden

Ich habe mit Typoskript (für angularJS 1.5) seit 1 Jahr entwickelt und hatte nie irgendwelche Probleme mit meinem Namespacing.

// 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(); 

Was ist, wenn ich mehr Datei importieren muss. Ich kann nicht mehr als eine "App" -Variable importieren und möchte nicht jedes Mal Alias ​​erstellen, wenn ich einen Import verarbeite.

Dies ist der Fall will ich nicht, und ich würde beheben mag:

// 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(); 

Bin ich falsch mit etwas oder habe ich etwas über Chaos webpack? Wie kann ich mit Namespace wie in PHP mit Webpack spielen?

EDIT 2016/22/07 um 6:26 Uhr

ich gelernt, dass es nicht möglich ist, Namespace zu verwenden webpack verwenden. Warum ? Weil jede .ts-Datei als ein Modul mit einem eigenen Gültigkeitsbereich betrachtet wird.

Modulentwicklung erforderlich.

Ich habe eine Lösung gefunden, um meinen Dateianruf mit Hilfe des Moduls anstelle des Namensraums klarer zu machen.

In meinem Fall habe ich App/Core, die Http, Service, Factory, Provider ... Ordner enthält. Im Stammverzeichnis des Core-Ordners habe ich eine index.ts-Datei erstellt, die alle meine benötigten Dateien mit Modularchitektur exportiert. Mal schauen.

// 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 

Und in einem anderen Dateiaufruf importieren Sie das Modul mit dem Alias ​​Core.

// 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

In Ihrem Beispiel haben Sie Klassen innerhalb eines Moduls exportiert, was zu einem "TS1194: Export-Deklarationen sind in einem Namespace nicht erlaubt" -Fehler führt, wie haben Sie das gehandhabt? – hillin

Antwort

1

Ich habe gelernt, dass es nicht möglich ist, Namespace mit Webpack zu verwenden. Warum ? Weil jede .ts-Datei als ein Modul mit einem eigenen Gültigkeitsbereich betrachtet wird.

Modulentwicklung erforderlich.

Ich habe eine Lösung gefunden, um meinen Dateianruf mit Hilfe des Moduls anstelle des Namensraums klarer zu machen.

In meinem Fall habe ich App/Core, die Http, Service, Factory, Provider ... Ordner enthält. Im Stammverzeichnis des Core-Ordners habe ich eine index.ts-Datei erstellt, die alle meine benötigten Dateien mit Modularchitektur exportiert.

Überprüfen Sie es in meinem Post Ich aktualisierte es.

2

Sie sollten nicht gleichzeitig mit Namespaces und Module sein, auch wenn Sie nicht webpack verwendet haben würden Sie das gleiche Problem haben

ein normaler Ansatz mit Modulen ist nur direkt die Klasse zu exportieren:

// 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(); 

das andere Beispiel:

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

hoffen, dass diese hilft :)

+0

Danke für diese Antwort, aber ich muss Namespacing verwenden, weil es eine riesige App ist. Ich entwickle das neue Backoffice meines Unternehmens. Ich habe früher ein persönliches Projekt mit Gulp entwickelt und ich habe Namespace funktioniert. Haben Sie einen anderen Ansatz, um dies zu erreichen? mag ein spezielles Modul erstellen oder meine ts-Datei in nur einen zusammenfassen, um diese als Modul zu erstellen und zu importieren. – Disfigure

+1

Wenn Sie keine Module verwenden, können Sie Namespaces einfach verwenden, aber mit Modul-Namespaces ist das nicht nötig, und tatsächlich wird in Ihrem Weg gehen, wie jedes Modul in einem separaten Bereich ist, so dass Ihre separaten Namespace-Deklarationen nicht zusammengeführt werden – kruczy

+0

Also mein Hauptproblem wird durch was verursacht? Ich verstehe es nicht. Ich habe herausgefunden, dass dies durch das Webpack und das Modulsystem verursacht wird. Auf diese Weise sollte ich einen Nomenklaturkonflikt haben ... – Disfigure

1

In TypeScript können Sie Namespaces mit einer anderen Art von Importanweisung Aliasnamen. Es ist ziemlich einfach.

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; 

Zur Laufzeit, das ist nicht anders als const Test2 = App2.Core.Http.Test2; aber zur Compile-Zeit, unter Verwendung eines import Aussage bringt über alle Typinformationen auch.

+0

Ja, aber wie es in meinem Beitrag erwähnt wird "Was ist, wenn ich mehr Dateien importieren muss? Ich kann nicht mehr als eine "App" -Variable importieren und möchte nicht jedes Mal Alias ​​erstellen, wenn ich einen Import verarbeite. ' aber danke für deine Hilfe trotzdem :) hoffe das hilft jemandem – Disfigure

+0

ich sehe was du meinst; Sie sprechen über das Verhalten von PHP, bei dem der gleiche Namespace in mehreren Dateien in einem Namespace zusammengeführt wird. Meine Verwirrung kam von den Unterschieden zwischen PHP-Namespaces und TypeScript-Namespaces. Es ist möglich, Namespaces in TypeScript zu verwenden, aber sie verhalten sich nicht wie PHP. – cspotcode

+0

Ja, ich weiß, mit Modul mit TypeScript ist das Namespace-Verhalten nicht wie bei PHP, weil im Modul keine Daten mit dem globalen Bereich geteilt werden. Deshalb müssen Sie alle Ihre Dateien eins nach dem anderen importieren, da jede Datei ein Modul ist. – Disfigure