2013-05-09 24 views
6

ho un page-a.ts che compilare in page-a.js:dattiloscritto: modulo di importazione con solo dichiarazioni

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

E ho una main.ts che compila in main.js:

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

E questo è il mio comando tsc riga:

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

e sto usando requirejs come questo:

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

non riesco a vedere la messagebox avviso da page-a durante il caricamento della pagina. E negli script creati main.js, non c'è nulla su page-a.

La mia domanda è, perché sta succedendo? E come posso forzare il dattiloscritto per importare un modulo che non è esplicitamente utilizzato dal codice?

+0

Ho accettato questa risposta in quanto è la risposta giusta per la mia domanda. Ma ho usato un altro approccio per risolvere il mio problema, che puoi vedere qui: https://typescript.codeplex.com/discussions/443144 – deerchao

risposta

3

Il js generato non importa un modulo non utilizzato esplicitamente nel codice. Typescript è intelligente in questo modo e non genererà alcun js per un modulo che è solo importato e non utilizzato.

È necessario:

  • esportazione di una variabile nel primo modulo E
  • importazione il primo modulo del secondo modulo E
  • utilizzare la variabile esportati secondo modulo

quindi avere a.js della pagina qualcosa come:

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

e main.ts come:

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

Grazie, il tuo trucco funziona. Aspetterò un po 'di tempo per vedere se c'è una soluzione migliore prima di accettare la risposta. – deerchao

+1

Non è un inganno :) requirejs "richiede" i moduli da includere nei blocchi define ([],() => {}). –

+0

TypeSript lo genererà solo se è presente un'esportazione da esportare nel file. –

11

Ci sono altri due modi, oltre a quella fornita dal @basarat per assicurare che il modulo importato è incluso nella funzione di definire e quindi caricata.

Include l'elemento di dipendenza amd nella parte superiore del file TypeScript.

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

o

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

Il primo è probabilmente quello con il minor probabilità di avere effetti collaterali. Sfortunatamente, l'elemento e il suo utilizzo non sono ben documentati.

Ho trovato questi metodi necessari quando si utilizza il caricamento lazy dei moduli AngularJS che creano e registrano i tipi da iniettare in dipendenza. Poiché il tipo non viene mai creato o assegnato fino al compilatore TS, non crea il parametro necessario per la funzione define.

Dicono che questo è di progettazione (https://typescript.codeplex.com/workitem/2436) ma sono rispettosamente in disaccordo.Se ho importato un modulo/file e ho un riferimento a un tipo concreto in quel modulo, allora quel modulo deve essere caricato in quel punto per funzionare. Dover fare ulteriori passaggi è ridondante.

0

so che sono in ritardo, ma qui è un altro modo per raggiungere questo obiettivo:
Si può dire dattiloscritto di importare un modulo solo per gli effetti collaterali utilizzando:
import "path/to/external/module";
Anche se questo è ES6 sintassi dattiloscritto trasformerà richiede AMD() quando si passa --module amd a tsc e poiché viene importato solo per gli effetti collaterali non verrà eliminato.

Problemi correlati