Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida Typescript - Moduli

Guida Typescript

Capitolo 11° - Moduli

<< Precedente Prossimo >>

Classi ed interfacce supportano lo sviluppo di grandi applicazioni Javascript fornendo un meccanismo per descrivere come un certo componente può essere usato separando la sua implementazione. Typescript applica l'incapsulamento nelle classi durante la progettazione (non permettendo l'uso dei membri privati), ma non può applicare l'incapsulamento a runtime siccome tutte le proprietà di un oggetto sono accessibili durante l'esecuzione. Questo si spera verrà risolto in future versioni di Javascript.

L'unico modo per applicare l'incapsulamento a runtime è quello di usare il module pattern: usare le closure per incapsulare le variabili. Un modulo può anche essere utile per creare dei namespaces, permettendo di evitare l'uso del namespace globale.

Un esempio di module pattern:

(function(exports) { 
 var key = generateSecretKey(); 
 function sendMessage(message) { 
   sendSecureMessage(message, key); 
 } 
 exports.sendMessage = sendMessage; 
})(MessageModule); 

Questo esempio illustra i due elementi essenziali del module pattern: una closure e un oggetto. La closure racchiude l'implementazione, mentre l'oggetto contiene le funzioni e variabili che vengono esportate dal modulo. Il modulo qui sopra prende come parametro un oggetto, 'exports', dopodichè gli aggiunge la proprietà 'sendMessage'. Questo approccio augmentativo semplifica il caricamento dinamico di moduli e permette la loro separazione in files diversi.

I moduli in Typescript forniscono un modo succinto per definire il module pattern. In Typescript classi e moduli possono essere nidificati.

Un esempio di modulo:

module M { 
 var s = "hello"; 
 export function f() { 
   return s; 
 } 
} 
M.f(); 
M.s; // Errore, s non è esportato

In questo esempio la variabile 's' è privata all'interno del modulo, ma 'f' viene esportata ed è accessibile dall'esterno. Se dovessimo descrivere l'effetto del modulo 'M' in termini di interfacce e variabili, scriveremmo:

interface M { 
 f(): string; 
} 
var M: M;

L'interfaccia 'M' sommarizza il comportamento del modulo 'M'. Nota come i nomi di moduli e di variabili non entrano in conflitto (non condividono lo stesso scope lessicale).

Il modulo 'M' è un esempio di moduli interno (internal), siccome è nidificato all'interno del modulo 'global'. Il compilatore emetterà il seguente codice Javascript per il modulo:

var M; 
(function(M) { 
 var s = "hello"; 
 function f() { 
 return s; 
 } 
 M.f = f; 
})(M||(M={}));

In questo caso il compilatore suppone che il modulo risieda nella variabile globale 'M', che potrebbe essere già inizializzata, oppure no.

Typescript supporta anche i moduli esterni (external), i quali sono files che contengono delle direttive export e import al livello più alto. Per questo tipo di modulo il compilatore emetterà del codice dove la closure del modulo e l'implementazione del modulo cambiano in base al sistema di caricamento dinamico, ad esempio il sistema asincrono di definizione moduli (Asynchronous Module Definition system).

<< Precedente Prossimo >>
A proposito dell'autore

E' un appassionato di programmazione con un particolare interesse per le tecnologie web e mobile. Da 11 anni gestisce il sito pierotofy.it e lavora negli Stati Uniti come consulente informatico tramite la sua azienda, MasseranoLabs LLC. Seguilo su Twitter: @pierotofy