2017-02-06 3 views
0

Sagen, ich habe ein ModulTyposkript: Wie mit ursprünglichen Namen importieren

module A 
{ 
    export function X() 
    { 
     … 
    } 
} 

, die ich so in einem anderen Modul verwenden möchten:

// Import fails with "Cannot find module 'A'." even with 
// A.ts being in same directory 
import * as A from "A"; 

module B 
{ 
    function Y() 
    { 
     // Module and function name carry information 
     // which I want to keep for readability. 
     A.X(); 
    } 
} 

Dies sollte der einfachste Fall der Ausfuhr und importieren, aber ich kann es einfach nicht zur Arbeit bringen.

UPDATE:

Wie gesagt: Der Modulname Wert trägt. Sie haben ähnliche benannte Funktionen in mehreren Modulen (oder Namespaces). i.E.

module C 
{ 
    export function X() 
    { 
     … 
    } 
} 

Und ich möchte auf keinen Fall die Funktionen Namen tun A.A_X und C.C_X - Redundante Namensgebung macht mich erschaudern.

+0

Der Modulname ist der Name der Datei. In Ihrem Beispiel, das einen Platzhalterimport verwendet, muss derselbe Funktionsname in mehreren Dateien nicht zu einem Konflikt führen. Selbst wenn Sie den gleichen Dateinamen mit den gleichen Funktionen an zwei verschiedenen Orten hätten, könnten Sie beide mit Wildcard mit verschiedenen Namen importieren, zB '' 'importieren * als A von" ./A "; Import * als OtherA von "../A"; '' 'Oder Sie können die Funktionen selbst mit' as 'wie 'import {func as func1} von" ./A "importieren; import {func as func2} aus "./B" ' – Aaron

Antwort

3

ein Modul

Benutze das Stichwort module nicht anwenden. Es wurde in namespace umbenannt und es ist nicht sinnvoll, Module zu erstellen.

// A.ts 
export function X() 
{ 
    … 
} 

// B.ts 
import * as A from "./A"; 
function Y() 
{ 
    A.X(); 
} 

A-Modul ist ein JavaScript (oder Maschinenschrift) Datei mit einem import oder einem export auf der Stammebene.

Ein TS-Namespace in einem Modul

Wenn Sie ein namespace von Ihrem Modul zu exportieren, ist hier ein Beispiel:

// A.ts 
export namespace A { 
    export function X() 
    { 
     … 
    } 
} 

// B.ts 
import {A} from "./A"; 
function Y() { 
    A.X(); 
} 

In Datei A.ts, bemerken die beiden Exporte. Auf der Stammebene ist dies der Standardmodul-Export. Im Namespace ist export function X eine nicht standardmäßige Funktion von TypeScript, mit der im Namespace etwas Öffentliches deklariert wird.

Beachten Sie außerdem die Syntaxänderung des Imports in der Datei B.ts.

Sie können eine Präsentation der Modul-Syntax in this article von Mozilla lesen.

+0

Wenn ich' namespace' nicht benutze, wie Sie vorschlagen, dann wird auf der Javascript-Seite eine Funktion namens 'function X()' generiert. Natürlich möchte ich, dass die generierte JavaScript-Funktion auch 'function A.X()' genannt wird. (Sonst werde ich bald mehrere in Konflikt stehende init() - und onXXXClick-Funktionen haben) Was ist der Fall, wenn ich 'namespace A' verwende. Aber dann bekomme ich einen Fehler "Fehler TS2306: Datei '.../A.ts' ist kein Modul." Das scheint so kompliziert. – Martin

+0

@Martin Das aktuell generierte JavaScript ist nicht so wichtig. In ein paar Jahren wird das generierte JS die Schlüsselwörter 'export' und' import' und den Namen 'A' importieren.Aber ich werde bearbeiten, um Namespaces in Ihrem Modul hinzuzufügen. – Paleo

+0

@Martin Ich bearbeitet. – Paleo

Verwandte Themen