TypeScript approda in Node.js... ma non come te lo aspetti!

TypeScript e Node.js by default

Negli ultimi anni, TypeScript e Node.js sono diventati due pilastri fondamentali per lo sviluppo moderno, utilizzati da aziende e sviluppatori di tutto il mondo. TypeScript, con il suo supporto ai tipi statici, ha rivoluzionato il modo in cui scriviamo JavaScript, migliorando la sicurezza del codice e riducendo gli errori. Dall'altro lato, Node.js ha permesso l'uso di JavaScript lato server, rendendo possibile lo sviluppo full-stack con un unico linguaggio.

Oggi, una nuova funzionalità sperimentale porta l'integrazione tra TypeScript e Node.js a un livello successivo: lo stripping dei tipi direttamente all'interno di Node.js.

Ma in cosa consiste esattamente questa innovazione e come cambierà il nostro modo di lavorare?

 

TypeScript in Node.js

L'integrazione di TypeScript con Node.js non è un concetto nuovo. Da quando TypeScript ha preso piede nel 2012, gli sviluppatori hanno cercato tanti modi per usarlo all'interno di Node.js. Tuttavia, questa integrazione ha sempre richiesto strumenti aggiuntivi come transpiler (es. tsc, il compilatore di TypeScript) e bundler (come Webpack o esbuild) per convertire il codice TypeScript in JavaScript puro eseguibile da Node.js.

Nonostante questi strumenti, l'uso di TypeScript in Node.js comporta una certa complessità. Il processo di transpiling aggiunge passaggi extra al workflow di sviluppo, rallentando il build process e aumentando il rischio di errori tra ambienti diversi. È qui che entra in gioco la nuova funzionalità di stripping dei tipi, promettendo di snellire il processo.

 

Cos'è lo Stripping dei Tipi in Node.js?

Lo stripping dei tipi è una funzionalità sperimentale di Node.js che mira a rimuovere i tipi TypeScript senza necessità di un transpiler esterno. In pratica, Node.js si occupa direttamente di eliminare tutte le annotazioni di tipo presenti nel codice TypeScript, eseguendo poi il codice come JavaScript nativo.

Questa novità rappresenta un cambiamento significativo rispetto al tradizionale transpiling tramite strumenti come ts-node o Babel, che richiedono una fase di build separata per trasformare il codice. Con lo stripping dei tipi, Node.js rimuove i tipi "al volo", semplificando il processo e rendendolo più fluido.

ATTENZIONE però: questa funzionalità non esegue alcun controllo dei tipi a runtime. Il suo unico compito è eliminare le annotazioni di tipo durante l'esecuzione, senza validare, il che la distingue da altre soluzioni più tradizionali.

 

Vantaggi e Svantaggi dello Stripping dei Tipi

Come ogni nuova funzionalità, lo stripping dei tipi presenta sia vantaggi che svantaggi.

Vantaggi

  • Performance migliorate: Ridurre o eliminare la fase di transpiling può portare a un'esecuzione più veloce del codice, soprattutto nei progetti più complessi.
  • Semplicità nel build process: Con lo stripping dei tipi, non è più necessario configurare un compilatore esterno, semplificando il workflow di sviluppo.
  • Maggior flessibilità: Essendo una funzionalità di Node.js, diventa più facile integrare TypeScript in ambienti server-side senza complicazioni.

Svantaggi

  • Mancanza di controllo sul tipo a runtime: Lo stripping dei tipi non esegue verifiche sui tipi durante l'esecuzione. Questo significa che eventuali errori di tipo possono passare inosservati fino a quando non si verificano bug a runtime.
  • Debugging più difficile: Senza una verifica dei tipi, risolvere problemi legati a tipi errati potrebbe essere più complesso, poiché eventuali errori emergono solo al momento dell'esecuzione.

 

Quando utilizzare lo stripping dei tipi?

Questa funzionalità può essere utile in ambienti dove la performance e la semplicità sono prioritarie, come nel caso di sviluppi rapidi o prototipazioni. Tuttavia, per progetti mission-critical o dove è richiesta una forte sicurezza, potrebbe essere più indicato continuare a usare TypeScript con un processo di transpiling completo per garantire la validazione dei tipi.

 

Come Abilitare e Utilizzare lo Stripping dei Tipi in Node.js

L'abilitazione dello stripping dei tipi in Node.js è un processo semplice. Essendo una funzionalità sperimentale, dovrai aggiungere un flag specifico quando esegui il tuo progetto Node.js.

Passi per abilitare lo stripping dei tipi:

  1. Assicurati di avere Node.js aggiornato alla versione più recente che supporta questa funzionalità, o comunque maggiore o uguale alla v22.6.0)
  2. Usa il comando
1node --experimental-strip-types file.ts

Questo comando eseguirà il file .ts, eliminando tutte le annotazioni di tipo.

Esempio di codice

1function greet(name: string): string {
2   return `Hello, ${name}`;
3}
4
5console.log(greet("World"));

Quando esegui il file con il flag di stripping dei tipi, Node.js ignorerà le annotazioni ed eseguirà il codice come se fosse JavaScript puro.

Al momento potrete visualizzare un Warning relativo alla natura sperimentale di questa funzionalità, quindi questo flag potrebbe cambiare in futuro.

In fase di sviluppo, questa funzionalità può velocizzare l'esecuzione dei test, ma in ambienti di produzione è consigliabile fare attenzione, poiché non ci sono controlli sui tipi.

Infatti, proviamo a modificare il file sorgente con qualcosa del genere:

1function greet(name: invalidType): notExistingType {
2   return `Hello, ${name}`;
3}
4
5console.log(greet("World"));

Abbiamo messo due tipi non esistenti, infatti il nostro IDE ci segnalerà prontamente l’errore. Noi ignoriamo questo warning, salviamo il file e rilanciamo il comando:

1node --experimental-strip-types file.ts

Node ci ritornerà l’output del file, ignorando i problemi di typing; questo proprio perchè questo flag rimuove i tipi, ma non esegue un controllo sulla loro validità!

Dunque per ovviare a questo problema, al momento dobbiamo fare ricorso al compilatore tsc attraverso il comando:

1npx tsc --noEmit file.ts && node --experimental-stip-types file.ts

Questo comando tramite il flag noEmit eviterà di generare il file JavaScript di output e si limiterà a fare un controllo sui tipo; se il controllo va a buon fine, il successivo comando eseguirà il codice, se invece fallisce avremo la lista dei problemi a schermo.

 

Implicazioni per il Futuro: Cosa Aspettarsi?

La funzionalità di stripping dei tipi è solo l'inizio di un possibile cambiamento nel modo in cui TypeScript e Node.js interagiscono. In futuro, potremmo vedere ulteriori miglioramenti o una versione stabile che permetta di integrare ancora più strettamente TypeScript nel runtime di Node.js, magari con controlli di tipo opzionali a runtime.

L'introduzione di questa funzionalità ha già generato discussioni all'interno della community degli sviluppatori. Alcuni la vedono come un passo avanti verso una maggiore efficienza, mentre altri sono preoccupati per la potenziale perdita di sicurezza senza la verifica dei tipi.

Per approfondire l’argomento di Node.js e TypeScript vi rimandiamo alla documentazione ufficiale.

Inoltre, l’intero ecosistema Node.js è in fermento, con le ultime versioni sono approdate molte funzionalità interessanti (oltre il già citato supporto a TypeScript sperimentale) come:

  • EcmaScript Module Support by default
  • Built-In tests runner
  • Watch flag
  • env-file flag
  • Promise Based Standard Libraries
  • Top level await
  • Glob file search
  • Built-In Debugger
  • Built-In WebSocket creation
  • Built-In SQLite Database

 

Conclusione: Una Nuova Frontiera per lo Sviluppo con TypeScript e Node.js

Lo stripping dei tipi rappresenta una nuova frontiera per lo sviluppo con TypeScript e Node.js, offrendo una soluzione più rapida e snella per chi cerca di sfruttare i benefici di TypeScript senza la complessità aggiuntiva del transpiling. Sebbene ancora sperimentale, questa funzionalità offre un'interessante visione del futuro dell'ecosistema Node.js.

Per gli sviluppatori, ora è il momento di sperimentare, testare questa funzionalità e fornire feedback per migliorare ulteriormente il supporto a TypeScript in Node.js.

Chi sa? Forse un giorno, l'uso di TypeScript in Node.js diventerà ancora più integrato e naturale rispetto a oggi!

Ultimi Articoli