2012-10-14 11 views
22

Dire che voglio avere una classe per file .ts. Ho due file .ts, che sembrano così:Come si mettono più moduli esterni nello stesso spazio dei nomi in TypeScript?

export module MyClasses { export class A {} } 

e

export module MyClasses { export class B {} } 

non posso fare questo:

import MyClasses = module('A'); 
import MyClasses = module('B'); 

Come faccio a definire le classi in file separati e metterli nello stesso "spazio dei nomi"? Inoltre, si finisce per dover fare qualcosa di simile:

MyClasses.MyClasses.A 

invece di

MyClasses.A 

Qual è il punto di questo ulteriore livello di gerarchia? In modo che tu possa avere più di un modulo esportato in un file di modulo? La soluzione migliore che ho scoperto finora è quella di rimuovere il "modulo di esportazione" (dal momento che "la classe di esportazione" sembra essere sufficiente per la compilazione di AMD), che sposta la classe su un livello gerarchico. Quindi:

import AModule = module('A'); 
module MyClasses{ var A = AModule.A; } 
import BModule = module('B'); 
module MyClasses { var B = BModule.B; } 

Anche se funziona perfettamente, non è esattamente sintetico. Non c'è un modo migliore per farlo?

+1

Ho fatto una richiesta di funzionalità per una parola chiave che fa qualcosa di simile: http://typescript.codeplex.com/workitem/305 – Brent

risposta

1

Scusate i nomi delle variabili povere, stavo testando questo in Visual Studio. Ha funzionato per mio quando si usano nomi diversi per le istruzioni di importazione.

import x = module('A'); 
import y = module('B'); 

x.MyClasses.A; 
y.MyClasses.B; 

In alternativa, è possibile utilizzare i commenti di riferimento ad un effetto simile, ma questo è meglio se in fase di installazione, se non si utilizza il modulo di carico. Si avrebbe bisogno di eliminare la parola chiave export dai due MyClasses dichiarazioni:

///<reference path='A.ts'/> 
///<reference path='B.ts'/> 

var x = MyClasses.A; 
3

io non credo che ci sia un modo migliore per raggiungere questo obiettivo con moduli esterni. Le specifiche del linguaggio definiscono i moduli esterni come segue:

I moduli esterni (sezione 9.4) sono corpi di codice caricati separatamente con riferimento ai nomi dei moduli esterni. Un modulo esterno viene scritto come un file sorgente separato che contiene almeno una dichiarazione di importazione o esportazione.

Più in basso si dice che interne moduli sono indeterminato e possono estendersi su più file:

moduli interni sono dichiarazioni dei moduli “a tempo indeterminato” e interni con lo stesso qualificato nome relativo alla una radice comune (come definita nella sezione 2.2) contribuisce a un singolo modulo.

Non ho trovato altri riferimenti a dichiarazioni simili per moduli esterni. Sono praticamente convinto che non lo sia. Se hai bisogno di caricare il modulo, dovrai vivere con i percorsi di riferimento per accedere ai tipi caricati da file diversi.

Tuttavia, per me sembra che sia meglio utilizzare i moduli interni.Poi si può semplicemente diffondere il modulo su due file

export module MyClasses { export class A {} } 

e

export module MyClasses { export class B {} } 

li mettono in ambito con percorsi di riferimento

///<reference path='A.ts'/> 
///<reference path='B.ts'/> 

e poi semplicemente farvi riferimento con il nome del modulo, come per esempio

var a = new MyClasses.A(); 
+6

Mentre il commento 'reference' può rendere il vostro TypeScript preferito IDE felice, non caricherà il tuo modulo in fase di runtime. –

8

Purtroppo non sembra essere una soluzione perfetta, ma questo è come ho risolto per ora:

file 'Regolatori/MainController.ts': Controller

class MainController { 
    ... 
} 

export = MainController; 

File' /SecondController.ts':

class SecondController { 
    ... 
} 

export = SecondController; 

file 'Controller/Namespace.ts':

import MainController = require('./MainController'); 
import SecondController = require('./SecondController'); 

export = { MainController, SecondController } 

File 'App.ts' (in cui viene utilizzato il 'namespace')

import Controllers = require('Controllers/Namespace'); 

angular.module('app', []) 
    .controller('MainController', Controllers.MainController) 
    .controller('SecondController', Controllers.SecondController) 

Questo ti dà bella IntelliSense, nasconde le istruzioni import 400 di distanza e mantiene il codice in cui lo spazio dei nomi è in realtà usato abbastanza pulito ...

+0

Potrebbe essere necessario utilizzare il modulo: ' esportazione * da" ./MainController "; esportazione * da "./SecondController"; ' in Namespace.ts – pennyowe

Problemi correlati