2013-07-18 10 views
8

Sto cercando di usare dattiloscritto nel nodo e sono attualmente utilizzato per usare dattiloscritto tramite la sintassi ///<reference.../> utilizzando esclusivamente moduli interni. Tuttavia, con progetti più grandi questo può diventare ingombrante in quanto è possibile avere moduli che fanno riferimento ad altri moduli che hanno tutti riferimenti di interconnessione.Wrap molti moduli interni per l'esportazione in dattiloscritto

Quindi, per questo progetto nodo pensavo di cercare di raggruppare tutti logiche componenti come moduli interni/classi molto simile prima, quindi saranno tutti riferimento internamente tra loro, ma li espongono tramite un modulo esterno che esporrebbe classi sottostanti ecc

questo modo la sintassi sarebbero molto simili di nodi meccanismi che richiedono esistenti, come:

import database = require("my-external-db-module.ts"); 
var connection = new database.Connection(someUrl); 

anziché

///<reference path="my-internal-db-modules.ts" /> 
var connection = new Database.Connection(someUrl); 

E immagino la sintassi sarebbe qualcosa di simile:

///<reference path="all-my-internal-module-files-etc.ts" /> 
///<reference path="..." /> 
export module SomeExposingModule 
{ 
    // Not quite sure what to put in here to expose the internal modules 
} 

così ci sono alcun tipo di best practice in questo genere di cose o di qualsiasi altri che hanno fatto qualcosa di simile, o se tutti solo rispettare utilizzando moduli interni per cose complesse?

risposta

6

Non sono sicuro che questa sia una pratica negativa o meno, ma ecco come ho risolto il mio problema.

Prima un breve riassunto del problema nuovo:

ho più file logicamente raggruppate in uno spazio dei nomi, ad esempio Framework poi tutti i file sotto ci saranno Framework.*, come ad esempio Framework.Database o Framework.UnitOfWork. Quindi questi sono tutti compilati tramite tsc --out framework.js ... così ho ottenuto tutto questo prodotto in un file framework.js.

Ora suona bene, tuttavia non consente di esportare i moduli quando si utilizza --out perché si estende su più file, quindi per far funzionare il nodo ho bisogno di esportare i moduli in qualche modo, quindi ho praticamente aggiunto un dattiloscritto file che ancora manualmente questo per me nella compilazione:

// exporter.ts 
module.exports = Framework; 

fornendo così questo è l'ultimo file aggiunto alla compilation tsc vi ritroverete con qualcosa di simile:

// Framework.js 
var Framework; 
(function (Framework) { 
    // lots of good stuff 
})(Framework || (Framework = {})); 
module.exports = Framework; 

Quindi questo sarà esportare la moduli interni f ine e la dichiarazione di esportazione sarà ora inclusa a causa del file exporter.ts che ora è incluso.

Quindi non sono sicuro se questa è una pratica sbagliata, ma questo mi permette di avere il meglio di entrambi i mondi, un modulo riutilizzabile che è strutturato con spazi dei nomi e si sviluppa su una struttura di file ragionevole, e un singolo compilato modulo che può essere incluso per riferimenti o per nodojs richiede.

Quindi l'utilizzo sarà simile:

var Framework = require("./framework"); 
var database = new Framework.Database.DbConnection(); 
+0

Nel mio caso, con uno script di costruzione Unix, ho trovato più facile ottenere lo stesso risultato con il seguente comando: echo 'module.exports = Framework;' >> Framework.js –

1

Quello che puoi fare è compilare un insieme di file TS in una combinazione .js + d.ts. per esempio. la seguente crea out.js e out.d.ts

tsc a.ts b.ts --out mod.js --declaration 

E poi (si spera) il seguente funzionerà:

///<reference path="mod.d.ts"> 
var mod = require('mod') 
+1

AH punto interessante si alza, faccio a generare un .d.ts * dal mio pipeline corrente. Quindi, se dovessi semplicemente compilarli tutti come moduli interni, richiederli tramite il d.ts che mi daranno l'intellisense e la sicurezza del tempo di compilazione, ma speravo di evitare l'uso della sintassi '/// '. Avrà un gioco con questa idea anche se questo mi sembra migliore se posso richiedere il file d.ts come un modulo esportato piuttosto che dover scrivere un wrapper per i miei moduli interni. – Grofit

2

Ci sono alcune idee che aiutano a smussare alcuni di questi problemi.

Se si dispone di molti riferimenti, è possibile utilizzare un file di riferimento per gestirli. Per esempio:

references.ts

///<reference path="a.ts" /> 
///<reference path="b.ts" /> 
///<reference path="c.ts" /> 
///<reference path="d.ts" /> 

Tutti gli altri file ...

///<reference path="references.ts" /> 

Ora avete un elenco centrale di vostri riferimenti, che è molto più facile di tessitura elenchi di riferimenti a la parte superiore di ogni file.

Nel tuo caso specifico, sarei più incline a utilizzare le istruzioni import e ottenere NodeJS per caricare i moduli per me - e vorrei raggruppare i moduli utilizzando il file system.

+0

Il mio problema non è tanto la gestione dei riferimenti, quanto nel mio progetto corrente, faccio come dici tu e funziona * ok *, quindi ho un carico di file sparsi nel progetto e uso uno script di build per generare una sorta di file di ricerca di riferimento a livello di progetto. Il problema che ho con questo approccio è che se ho un progetto di database e un progetto logico che dipende dal database, utilizzando l'approccio sopra il mio file logic.js compilato contiene sia il contenuto dei file ts del database che i file di logica ts , mentre spero di usare moduli esterni per evitare questa compilation extra * guff * – Grofit

+0

Siamo spiacenti di raddoppiare i commenti ma di continuare, quindi per evitare questo effetto valanga interno '/// ' include speravo in questo nuovo progetto per adottare i moduli esterni in modo che logic.js contenga solo i js compilati dai file logici e farebbe semplicemente riferimento all'altro modulo, creando un semplice tipo di dipendenza di runtime non uno di compilazione. Ho menzionato i problemi dell'approccio di cui sopra in un problema che ho sollevato con i bravi ragazzi che gestiscono Typescript. https://typescript.codeplex.com/workitem/923 Speravo di eludere il problema descritto con i moduli esterni – Grofit

+0

Sì, nel tuo caso mi impegnerei completamente a caricare moduli esterni su richiesta poiché si appoggia alle funzionalità NodeJS integrate. – Fenton