2017-03-05 2 views
1

Ich habe ein Node.js-Projekt, das ich vor kurzem aus ECMAScript 6-kompatiblem JavaScript in TypeScript konvertiert habe. Ich bin mir immer noch nicht ganz bewusst, wie TypeScript und ES6 interagieren, insbesondere in Bezug auf Namespaces und Typen.TypeScript ES6-Namespaces

Ich habe einen Unterordner in meinem Projekt sql, der, wie es klingt, eine Reihe von Funktionen exportiert, um mit der MySQL-Datenbank des Projekts zu interagieren. Ich möchte meine DB-Modelltypen in einem Sql.Models Namespace organisieren, so dass sie z. B. referenziert werden können. Sql.Models.User. Ich möchte, dass meine Modelle in einer oder mehreren .d.ts Dateien im Ordner sql deklariert werden, aber ich kann nicht herausfinden, wie man das richtig organisiert, so dass diese Typen woanders referenziert werden können. Ich kann natürlich nicht require oder import eine .d.ts Datei; Das ist keine gültige TypeScript-Operation. Wie kann ich den in einer .d.ts-Datei deklarierten Typ Sql.Models.User in einem anderen ES6-kompatiblen TypScript-Modul verwenden?

Antwort

0

Wie kann ich den Typ Sql.Models.User verwenden, der in einer .d.ts-Datei in einem anderen ES6-kompatiblen TypScript-Modul deklariert wurde?

Die folgende sehr einfache Einrichtung funktioniert.

root 
    sql 
    models.d.ts 
    index.ts 
    tsconfig.json 

Die model.d.ts Datei deklariert einen Namespace und einen Typ. Wie das Bild zeigt, kann die Datei index.ts diesen Namespace als Alias ​​verwenden und/oder direkt darauf zugreifen.

enter image description here

Die obige Typoskript Version 2.2.1 verwendet.

+0

Wenn ich es so einstelle, kann ich 'Sql.Models' nicht von einer anderen Datei, die einen Root-Level Namespace' Sql' hat, aufrufen. Vielleicht denke ich zu sehr an die Funktionsweise von C#, bei der mehrere Dateien an einem Namensraum teilnehmen können. Ich möchte, dass eine Klasse den 'Sql'-Namespace bereitstellt und die einzige Datei ist, die andere in meinem Projekt benötigen. Es wird ein paar allgemeine Funktionen definieren, wie zum Beispiel "query". Aber ich möchte auch andere Namespaces, die z. B. Modelle wie oben beschrieben bereitstellen, die alle Kinder des Namensraums "Sql" sind. – briman0094

+0

Bin ich richtig zu verstehen, dass Sie einen Namespace namens 'Sql' und einen anderen Kind Namespace namens' Sql.Models' haben wollen? –

+0

Das ist richtig. Ich denke, dass ich es geschafft habe, eine "models.ts" -Datei neben 'sql.ts' zu erstellen, die die Modellschnittstellen exportiert, sie dann in' sql.ts' importiert und sie dann wieder in ihren eigenen Namespace exportiert Datei ('importiere * als Modelle von" ./models "' und dann später 'exportiere Namespace Sql {export Namespace Modelle {Export Typ User = models.User;}}'. Es ist nicht so schön wie ich es möchte, aber es funktioniert und ergibt das Endergebnis, das ich will – briman0094

0

Ich löste das auf eine weniger als schöne Art und Weise, indem ich "Aliased Internal Imports" verwendete, die merkwürdig klingen, aber wirklich nicht sind. Ich exportiere einen Alias ​​in ein internes Symbol, bei dem es sich einfach um ein Symbol handelt, das aus einer anderen Datei importiert wurde.

source code

ich so etwas wie, wie C# Arbeiten vorgezogen hätte, wo ich den Namespace in zwei Dateien und irgendwie von einem anderen Alias ​​man definieren kann, so dass nur eine Datei referenziert werden muss, aber dies scheint nicht möglich mit ECMAScript 6-kompatiblem TypeScript.