2015-08-13 11 views
20

Ich habe mit der Arbeit an einem großformatigen Typoskript-Projekt begonnen.Verwenden von Namespace verteilt über mehrere Dateien in TypeScript

Von Anfang an möchte ich meine Dateien organisieren (dieses Projekt wird zwischen vielen Entwicklern aufgeteilt, daher ist eine Bestellung sehr notwendig).

Ich habe versucht, Module/Namespaces und Splitting-Klassen in separate Dateien für jeden einzelnen, mit einem Ordner mit dem Namespace.

Die Dateistruktur ist:

app.ts 
    \Classes 
    ---- \Animals 
    ---- ---- Mammals.ts 
    ---- ---- Reptiles.ts 

ich dann alle Dateien in diesem Namensraum in app.ts zu importieren versuchen, mit so etwas wie: import * as Animals from "./Classes/Animals"

Wie für die Namespace-Dateien selbst, ich habe versucht, die folgende, ohne Erfolg:

namespace Animals { 
    export class Mammals { 
     constructor() { 
     } 
    } 
} 

und auch:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

Leider wird der Pfad nie erkannt (da es auf einen Ordner und nicht auf eine einzelne Datei verweist). Ist das überhaupt möglich? Wenn alle meine Klassen aus einem einzigen Namespace in einer Datei stammen, ergeben sich Dateien, die Tausende von Zeilen lang sind und für dieses Projekt nicht pflegbar sind.

Ich habe auch bemerkt, dass TypeScript 1.5 Unterstützung für tsconfig.json unterstützt - jedoch jede Datei manuell der Karte hinzufügen ist ein sicherer Weg, Probleme einzuführen, wenn Entwickler Klassen hinzufügen.

HINWEIS: Ich verwende Visual Studio 2015, TypeScript 1.5 (ich glaube, nicht sicher, wie zu überprüfen). Ich habe auch ES6-Unterstützung eingeschaltet.

Vielen Dank für einen Rat, den Sie geben können!

+0

Das offizielle Handbuch beschreibt dies (obwohl ut möglicherweise nicht mehr aktuell) http://www.typescriptlang.org/Handbook#modules-splitting-across-files – pablochan

+0

Dank @pablochan - ich, dass man auch gesehen hatte, . Das Referenzieren jeder Datei im Namespace ist kontraintuitiv. Ist es möglich, auf den Namespace statt auf einzelne Dateien zu zeigen? – Askanison4

+0

Nein, es sei denn, Visual Studio oder ein anderes Tool unterstützt dies. – pablochan

Antwort

16

Verwenden Sie den Reexport, um ein externes Modul t zu erstellen Hutgruppen und Typen von anderen Modulen aussetzt:

// Classes/Animals.ts 
export * from '.\Animals\Mammals'; 
export * from '.\Animals\Reptiles'; 

dann die verschiedenen Typen von dem neuen Modul wie üblich importieren:

// app.ts 
import * as Animals from '.\Classes\Animals' 

let dog: Animals.Dog; 
let snake: Animals.Snake; 

Oder

// app.ts 
import { Dog, Snake } from '.\Classes\Animals' 

let dog: Dog; 
let snake: Snake; 
+0

Vielen Dank, das funktioniert einwandfrei – Laker

+0

Funktioniert das nicht mehr? Das ist genau das, was ich gerne tun würde, aber ich bekomme immer "... Säugetiere.ts ist kein Modul " – DanielC

0

Externe Module bedeuten, dass Sie die Module Datei für Datei laden. Sowohl AMD als auch CommonJS haben keinen Namensraum. Sie können eine Art Postprocessing verwenden, um Dateien in einem Modul zu bündeln.


Im Folgenden definiert eine interne Modul:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

Sie sollten nicht import für sie verwenden. Animals.Reptiles ist überall sichtbar. Das einzige Ziel besteht darin, Skripts in der richtigen Reihenfolge zu laden (z. B. Basisklassen vor Vorbestellern). Sie sollten also alle Dateien in ts.config oder anderswo auflisten. In meinem Projekt verwende ich Bundles für Ordner und habe eine Konvention, um @ zu Dateinamen von Basisklassen hinzuzufügen. Eine andere Lösung ist die Verwendung externer Module: AMD (RequireJS) oder CommonJS (Browserify). In diesem Fall entfernen Sie die obere Ebene module aus der Deklaration.Wenn eine Datei nur eine Art enthält, kann man sich als Wurzel exportieren:

class Reptiles { 
    constructor() { 
    } 
} 

export = Reptiles; 

Sie Modul von Dateipfad verweisen:

import Reptilies = require('..\Animals\Reptilies') 
var reptile = new Reptile(); 

Oder mit neuer ES6 Module:

export class Reptiles { 
    constructor() { 
    } 
} 

import { Reptiles } from '..\Animals\Reptilies'; 
+0

Wie würde ich in diesem Fall den Animations-Namespace importieren? Wenn ich einen Namespace mit 20 Klassen habe (die alle verwendet werden), möchte ich vielleicht einen Verweis. Zumindest ist das bei anderen Sprachen der Fall. Außerdem habe ich festgestellt, dass mit der Unterstützung von ES 6 der 'export = Reptiles;' - Code davon abgeraten wird, da er nicht upgradebar ist. – Askanison4

4

einen Weg gefunden, um Ihr Ziel zu erreichen, aber nicht mit Namespace-Schlüsselwort.

  1. Die "Tiere" Klassen, Animal.ts & Mammal.ts & Reptile.ts unter Namespace.
  2. mit index.ts für Barrel.
  3. animals.ts für die Namensraumgruppierung.

Animal namespace

Beispielklassen:

Classes

index.ts (als barrel)

enter image description here

animals.ts (für Namensraum-Gruppierung)

enter image description here

Und hier geht es um das Konzept des Namespace.

enter image description here

+0

für mich war das die richtige Antwort, da die Fässer vorhanden sind, kann man nun mehrstufige Namespaces haben, ich war auf der Suche nach etwas wie api.Animals.Dog und das lass mich das haben, wie auch immer war noch schöner, wenn es eine Möglichkeit gab, "Namespace" Schlüsselwort in diesem Ansatz zu verwenden –