2014-02-11 6 views
28

Es scheint, dass die Informationen darüber, wie Sie tatsächlich beim Schreiben von Typescript Code strukturieren ist nicht vorhanden.Wie teile ich mein Modul über mehrere Dateien in Typescript mit node.js

Ich möchte einen Server in Knoten machen. Es hat externe Abhängigkeiten wie socket.io. Der Server wird zu groß sein, um alles in eine Datei zu packen (so wie ich mir das meistens vorstelle), also dachte ich, ich würde es aufteilen. Ich möchte jede Klasse in einer separaten Datei haben, und ich möchte in der Lage sein, sie in das gesamte Projekt zu verwenden, ohne dass etwas verrückt wie

import vector = require("vector.ts"); 
var vec = new vector.Vector(); 

tun Wie kann ich das tun? Bis jetzt scheint es, dass ich an zwei Fronten kämpfe. Wenn ich tsc zum Kompilieren bekomme, beschwert sich der Knoten zur Laufzeit, aber wenn ich den Code so modifiziere, dass der Knoten funktioniert, kompiliert er nicht.

Ich würde mich freuen, wenn sich jemand die Zeit nehmen könnte, dies Schritt für Schritt durchzugehen.

Antwort

28

Eigentlich kann man (jetzt):

Datei: class1.ts:

export class Class1 { 
    name: string; 

    constructor(name: string){ 
     this.name = name; 
    } 
} 

Datei: class2.ts:

export class Class2 { 
    name: string; 
} 

Konsolidierung Moduldatei: classes.ts:

export { Class1 } from "./class1"; 
export { Class2 } from "./class2"; 

verbrauchende Datei:

import { Class1, Class2 } from "./classes"; 

let c1 = new Class1("Herbert"); 
let c2 = new Class2(); 

Auf diese Weise können Sie eine Klasse (oder Schnittstelle) pro Datei haben. In einer konsolidierenden Moduldatei (classes.ts) referenzieren Sie dann alle Entitäten, aus denen Ihr "Modul" besteht.

Jetzt müssen Sie nur auf einzelne Moduldatei verweisen (importieren), um auf alle Ihre Klassen zuzugreifen. Sie haben immer noch eine saubere Kompartimentierung zwischen den Dateien.

Hoffen, das hilft jedem noch suchen.

+0

Wie ist 'Import {Class1} von" ./class1 ";' anders als 'Import Class1 = require (". Class1 ");' – Daryl

+0

@Daryl, letzterer wird die Datei als ein Modul importieren und alle exportierten Elemente aufnehmen in ihm (möglicherweise mehrere Klassen/Schnittstellen usw.). – jmotes

+0

Diese Lösung ist sehr cool. Meine Vermutung ist, was ist der Vorteil der Verwendung von 'Modul MyModule {}' für jede Datei von 'Class1' und' Class2' und dann ein Import {MyModule}, um die Konsolidierung von Modulen wie hier erklärt http: // typescript zu teilen. codeplex.com/wikipage?title=Modules%20in%20TypeScript&referringTitle=TypeScript%20Documentation – loretoparisi

8

Externe Module mit mehreren Dateien werden in TypeScript noch nicht unterstützt.

Für Modulstrukturierungsempfehlungen, this page hat einen guten Überblick über die Optionen. Insbesondere wenn Sie genau eine Klasse pro Datei haben, können Sie export = verwenden, so dass die zweite Codezeile in Ihrem Beispiel einfach var vec = new vector(); wäre, was einigermaßen unkompliziert wäre.

+1

Das würde aber bedeuten, dass ich für jede Klasse, die ich in jeder Datei verwende, einen Import benötige, oder? Das scheint kaum praktisch. Ist das wirklich so? –

+0

Ich bin mir nicht sicher, was daran überraschend/unpraktisch ist. In der nicht-typeScript-Entwicklung von node.js beginnt jede Datei mit einer Reihe von "require" -Aufrufen für die Objekte, die diese Datei verwendet. –

+8

Nun, aus C# zum Beispiel, wo ich nur 'using' Direktiven für separate Namespaces haben muss, scheint das eine Menge zu sein. Ich denke, es ist nur eine Frage der Gewöhnung. –

Verwandte Themen