2015-08-13 20 views
20

Ho iniziato a lavorare su un progetto dattiloscritto su larga scala.Utilizzo dello spazio dei nomi su più file in TypeScript

Fin dall'inizio, voglio mantenere i miei file organizzati (questo progetto sarà diviso tra molti sviluppatori in modo che l'ordine sia molto necessario).

Ho tentato di utilizzare moduli/spazi dei nomi e classi di divisione in file separati per ognuno, con una cartella contenente lo spazio dei nomi.

La struttura dei file è:

app.ts 
    \Classes 
    ---- \Animals 
    ---- ---- Mammals.ts 
    ---- ---- Reptiles.ts 

Ho poi tenta di importare tutti i file in tale spazio dei nomi in app.ts utilizzando qualcosa di simile: import * as Animals from "./Classes/Animals"

Per quanto riguarda file stessi lo spazio dei nomi, ho cercato il in seguito, senza successo:

namespace Animals { 
    export class Mammals { 
     constructor() { 
     } 
    } 
} 

e anche:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

Sfortunatamente, il percorso non viene mai riconosciuto (poiché punta a una cartella e non a un singolo file). È possibile? Avere tutte le mie classi da un singolo spazio dei nomi in un file risulterà in file che sono migliaia di righe e per questo progetto che non è mantenibile.

Ho anche notato che TypeScript 1.5 ha il supporto per tsconfig.json - tuttavia, dover aggiungere ogni file manualmente alla mappa è un modo infallibile di introdurre problemi quando gli sviluppatori iniziano ad aggiungere classi.

NOTA: sto utilizzando Visual Studio 2015, TypeScript 1.5 (credo, non so come verificare). Ho anche il supporto per ES6 attivato.

Grazie per qualsiasi consiglio che puoi dare!

+0

Il manuale ufficiale copre questo (anche se ut potrebbero non essere aggiornate) http://www.typescriptlang.org/Handbook#modules-splitting-across-files – pablochan

+0

Grazie @pablochan - avevo visto anche quello . Fare riferimento a ciascun file nello spazio dei nomi come quello è contro intuitivo. È possibile indicare lo spazio dei nomi piuttosto che i singoli file? – Askanison4

+0

No, a meno che Visual Studio o qualche altro strumento non disponga di questo. – pablochan

risposta

16

Utilizzare la riesportazione per creare un modulo esterno t gruppi cappello ed espone i tipi da altri moduli:

// Classes/Animals.ts 
export * from '.\Animals\Mammals'; 
export * from '.\Animals\Reptiles'; 

Poi importare i tipi dal nuovo modulo come al solito:

// app.ts 
import * as Animals from '.\Classes\Animals' 

let dog: Animals.Dog; 
let snake: Animals.Snake; 

O

// app.ts 
import { Dog, Snake } from '.\Classes\Animals' 

let dog: Dog; 
let snake: Snake; 
+0

Grazie mille, funziona perfettamente – Laker

+0

Non funziona più? Questo è esattamente quello che mi piacerebbe fare, ma continuo a ricevere "... Mammiferi.ts non è un modulo " – DanielC

0

I moduli esterni implicano il caricamento dei file file per file. Sia AMD che CommonJS non hanno lo spazio dei nomi. È possibile utilizzare una sorta di postelaborazione per raggruppare i file in un modulo.


Di seguito definisce un modulo interno:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

non si dovrebbe usare import per esso. Animals.Reptiles è visibile ovunque. L'unico scopo è caricare gli script nell'ordine corretto (ad es. Le classi di base prima dei heritors). Quindi dovresti elencare tutti i file in ts.config o altrove. Nel mio progetto utilizzo bundle su cartelle e ho una convenzione per aggiungere @ ai nomi file delle classi base.

Un'altra soluzione è l'uso di moduli esterni: AMD (RequireJS) o CommonJS (Browserify). In tal caso, rimuovere il livello superiore module dalla dichiarazione.Se un file contiene un solo tipo è possibile esportarlo come una radice:

class Reptiles { 
    constructor() { 
    } 
} 

export = Reptiles; 

è possibile fare riferimento modulo dal percorso del file:

import Reptilies = require('..\Animals\Reptilies') 
var reptile = new Reptile(); 

O con nuovi moduli ES6:

export class Reptiles { 
    constructor() { 
    } 
} 

import { Reptiles } from '..\Animals\Reptilies'; 
+0

In questo caso, come dovrei importare lo spazio dei nomi di Animali? Se ho uno spazio dei nomi con 20 classi (che saranno tutte usate), potrei volere un riferimento. Almeno questo è il caso con altre lingue. Inoltre, ho notato che con il supporto di ES 6, il codice 'export = Reptiles;' sembra scoraggiato perché non è aggiornabile – Askanison4

4

trovato un modo per raggiungere il tuo obiettivo, ma non con la parola chiave namespace.

  1. gli "animali" classi, Animal.ts & Mammal.ts & Reptile.ts sotto namespace.
  2. con index.ts per barile.
  3. animals.ts per il raggruppamento degli spazi dei nomi.

Animal namespace

classi di esempio:

Classes

index.ts (come barile)

enter image description here

animals.ts (per namespace raggruppamento)

enter image description here

E qui si va del concetto di spazio dei nomi.

enter image description here

+0

per me questa era la risposta corretta, dato che i barili sono a posto ora puoi avere spazi dei nomi multi-livello, stavo cercando qualcosa come api.Animals.Dog e questo me lo permetta, comunque era ancora più bello se ci fosse un modo di usare la parola chiave "namespace" in questo approccio –

Problemi correlati