2013-05-09 14 views
6

ich eine page-a.ts haben, die in page-a.js kompilieren würde:Typoskript: Import-Modul mit nur Aussagen

alert('this is from page-a'); 

Und ich habe ein main.ts die in main.js kompiliert:

import pageA = module('page-a') 
alert('this is from main'); 

Und das ist mein tsc Befehl Linie:

tsc --module amd page-a.ts main.ts 

Und ich bin mit requirejs wie folgt aus:

<script src="require.js" data-main="main.js"></script> 

ich nicht die Warnung messagebox von page-a sehen können, wenn die Seite geladen wird. Und in den generierten Skripten main.js gibt es nichts über page-a.

Meine Frage ist, warum passiert das? Und wie erzwinge ich Typoskript, um ein Modul zu importieren, das nicht explizit vom Code verwendet wird?

+0

Ich habe diese Antwort akzeptiert, da es die richtige Antwort für meine Frage ist. Aber ich habe einen anderen Ansatz verwendet, um mein Problem zu lösen, den Sie hier sehen können: https://typescript.codeplex.com/discussions/443144 – deerchao

Antwort

3

Ihre generierte JS importiert kein Modul, das nicht explizit im Code verwendet wird. Typescript ist so clever und erzeugt keine js für ein Modul, das nur importiert und nicht benutzt wird.

Sie müssen:

  • Export eine Variable im ersten Modul UND
  • Import das erste Modul in dem zweiten Modul UND
  • Verwenden Sie die exportierte Variable im zweiten Modul

also haben page-a.js etwas wie:

export var x = 123; // just to export something that you can use 
alert('this is from page-a'); 

und main.ts als:

import pageA = module('page-a') 
var foo = pageA.x; // If you remove this line and you will not get the alert from page-a 
alert('this is from main'); 
+0

Danke, Ihr Trick funktioniert. Ich werde einige Zeit warten, um zu sehen, ob es eine bessere Lösung gibt, bevor ich die Antwort akzeptiere. – deerchao

+1

Es ist keine Trickserei :) requirejs "erfordert" Module, die in define ([],() => {}) Blöcke eingeschlossen werden. –

+0

TypeSript wird es nur erzeugen, wenn es eine SMS gibt, die in eine Datei exportiert werden soll. –

11

Es gibt zwei andere Möglichkeiten, neben dem von @basarat erwähnt, um sicherzustellen, dass das eingeführte Modul in der Funktion zu definieren, enthalten ist, und somit geladen.

Fügen Sie das amd-dependency-Element oben in der TypeScript-Datei ein.

///<amd-dependency path="pathToFileRelativeToBaseWithoutFileExtension"/> 

oder

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension"); 
moduleName; //Does not require declaring a new variable. 

Ersteres ist wahrscheinlich derjenige mit der geringsten Wahrscheinlichkeit von Nebenwirkungen. Leider sind das Element und seine Verwendung nicht gut dokumentiert.

Ich fand diese Methoden notwendig, wenn das verzögerte Laden von AngularJS-Modulen verwendet wird, die Typen erzeugen und registrieren, um Abhängigkeitsinjektionen zu erzeugen. Da der Typ für den TS-Compiler niemals erstellt oder zugewiesen wird, erzeugt er nicht den notwendigen Parameter für die Definitionsfunktion.

Sie sagen, dass dies von Entwurf ist (https://typescript.codeplex.com/workitem/2436), aber ich stimme respektvoll nicht zu.Wenn ich ein Modul/eine Datei importiert habe und ich habe einen Verweis auf einen konkreten Typ in diesem Modul, dann muss dieses Modul an diesem Punkt geladen werden, um zu funktionieren. Zusätzliche Schritte sind überflüssig.

0

Ich weiß, dass ich bin spät, aber hier ist eine andere Art und Weise, dies zu erreichen:
Sie Typoskript sagen kann, ein Modul nur für die Nebenwirkungen zu importieren, indem Sie mit:
import "path/to/external/module";
Obwohl diese es6 Syntax Typoskript ist verwandeln es in AMD erfordern(), wenn Sie übergeben --module amd zu TSC und da es nur für Nebenwirkungen importiert wird, wird es nicht fallengelassen.