Italiano

Padroneggia la configurazione di TypeScript con questa guida a tsconfig.json. Impara opzioni del compilatore, setup del progetto e configurazioni avanzate.

Configurazione di TypeScript: Una Guida Completa a tsconfig.json

TypeScript, un superset di JavaScript, introduce la tipizzazione statica nel mondo dinamico dello sviluppo web. Un file tsconfig.json ben configurato è cruciale per sfruttare tutta la potenza di TypeScript. Questa guida fornisce una panoramica completa di tsconfig.json, trattando le opzioni essenziali del compilatore, l'impostazione del progetto e le configurazioni avanzate.

Cos'è tsconfig.json?

Il file tsconfig.json è un file di configurazione che specifica le opzioni del compilatore per un progetto TypeScript. Indica al compilatore TypeScript come trasporre il codice TypeScript in JavaScript. Questo file è essenziale per definire la struttura del progetto, impostare le regole di compilazione e garantire la coerenza all'interno del team di sviluppo, sia che il team si trovi in un unico ufficio o sia distribuito in più continenti.

Creare un File tsconfig.json

Per creare un file tsconfig.json, naviga nella directory principale del tuo progetto nel terminale ed esegui il seguente comando:

tsc --init

Questo comando genera un file tsconfig.json di base con le opzioni del compilatore più comuni. Puoi quindi personalizzare il file per adattarlo ai requisiti specifici del tuo progetto. Un tipico tsconfig.json includerà opzioni come compilerOptions, include, e exclude.

Opzioni Essenziali del Compilatore

La sezione compilerOptions è il cuore del file tsconfig.json. Contiene una vasta gamma di opzioni che controllano il comportamento del compilatore TypeScript. Ecco alcune delle opzioni più importanti del compilatore:

target

L'opzione target specifica la versione di destinazione ECMAScript per il codice JavaScript generato. I valori comuni includono ES5, ES6 (ES2015), ES2016, ES2017, ES2018, ES2019, ES2020, ES2021, ES2022, ESNext. Scegliere il target giusto è fondamentale per garantire la compatibilità con l'ambiente di runtime previsto, come i browser o le versioni di Node.js.

Esempio:

{
  "compilerOptions": {
    "target": "ES2020"
  }
}

module

L'opzione module specifica lo stile di generazione del codice dei moduli. I valori comuni includono CommonJS, AMD, System, UMD, ES6 (ES2015), ES2020, e ESNext. La scelta del sistema di moduli dipende dall'ambiente di destinazione e dal bundler di moduli utilizzato (ad es. Webpack, Rollup, Parcel). Per Node.js, viene spesso utilizzato CommonJS, mentre per le applicazioni web moderne, è preferibile ES6 o ESNext con un bundler di moduli. L'uso di ESNext consente agli sviluppatori di sfruttare le funzionalità e le ottimizzazioni più recenti, affidandosi al bundler per gestire il formato finale del modulo.

Esempio:

{
  "compilerOptions": {
    "module": "ESNext"
  }
}

lib

L'opzione lib specifica un elenco di file di libreria da includere nella compilazione. Questi file di libreria forniscono definizioni di tipo per le API JavaScript integrate e le API del browser. I valori comuni includono ES5, ES6, ES2015, ES2016, ES2017, ES2018, ES2019, ES2020, ES2021, ES2022, ESNext, DOM, WebWorker, ScriptHost, ES2015.Core, ES2015.Collection, ES2015.Iterable, ES2015.Promise, ES2015.Proxy, ES2015.Reflect, ES2015.Generator, ES2015.Symbol, ES2015.Symbol.WellKnown, ES2016.Array.Include, ES2017.object, ES2017.Intl, ES2017.SharedMemory, ES2017.String, ES2017.TypedArrays, ES2018.Intl, ES2018.Promise, ES2018.RegExp, ES2019.Array, ES2019.Object, ES2019.String, ES2019.Symbol, ES2020.BigInt, ES2020.Promise, ES2020.String, ES2020.Symbol.WellKnown, ES2021.Promise, ES2021.String, ES2021.WeakRef, ES2022.Error, ES2022.Object, ES2022.String, e molti altri. Selezionare le librerie appropriate garantisce che il compilatore TypeScript disponga delle informazioni di tipo necessarie per l'ambiente di destinazione. L'uso della libreria DOM consente al progetto di compilare codice che utilizza API specifiche del browser senza errori di tipo.

Esempio:

{
  "compilerOptions": {
    "lib": ["ES2020", "DOM"]
  }
}

allowJs

L'opzione allowJs consente al compilatore TypeScript di compilare file JavaScript insieme a file TypeScript. Ciò è utile per migrare gradualmente progetti JavaScript esistenti a TypeScript. Impostandola su true si abilita il compilatore a processare i file .js, consentendo un'adozione graduale di TypeScript all'interno di un progetto.

Esempio:

{
  "compilerOptions": {
    "allowJs": true
  }
}

jsx

L'opzione jsx specifica come deve essere gestita la sintassi JSX. I valori comuni includono preserve, react, react-native, e react-jsx. preserve mantiene la sintassi JSX nell'output, mentre react trasforma JSX in chiamate a React.createElement. react-jsx utilizza la nuova trasformazione JSX introdotta in React 17, che non richiede l'importazione di React. Scegliere l'opzione JSX corretta è fondamentale per i progetti che utilizzano React o altre librerie basate su JSX.

Esempio:

{
  "compilerOptions": {
    "jsx": "react-jsx"
  }
}

declaration

L'opzione declaration genera i corrispondenti file di dichiarazione .d.ts per ogni file TypeScript. I file di dichiarazione contengono informazioni sui tipi e sono utilizzati da altri progetti TypeScript per consumare il codice compilato. La generazione di file di dichiarazione è essenziale per creare librerie e moduli riutilizzabili. Questi file consentono ad altri progetti TypeScript di comprendere i tipi e le interfacce esposte dalla libreria senza dover compilare il codice sorgente originale.

Esempio:

{
  "compilerOptions": {
    "declaration": true
  }
}

sourceMap

L'opzione sourceMap genera file di source map, che mappano il codice JavaScript generato al codice TypeScript originale. Le source map sono essenziali per il debug del codice TypeScript nei browser e in altri ambienti. Quando si verifica un errore nel codice JavaScript, la source map consente allo sviluppatore di vedere il codice TypeScript corrispondente nel debugger, rendendo più facile identificare e risolvere il problema.

Esempio:

{
  "compilerOptions": {
    "sourceMap": true
  }
}

outDir

L'opzione outDir specifica la directory di output per i file JavaScript generati. Questa opzione aiuta a organizzare l'output di compilazione del progetto separando il codice sorgente dal codice compilato. L'uso di un outDir rende più facile gestire il processo di compilazione e distribuire l'applicazione.

Esempio:

{
  "compilerOptions": {
    "outDir": "dist"
  }
}

rootDir

L'opzione rootDir specifica la directory principale del progetto TypeScript. Il compilatore utilizza questa directory come base per risolvere i nomi dei moduli. Questa opzione è particolarmente importante per i progetti con una struttura di directory complessa. Impostare correttamente la rootDir assicura che il compilatore possa trovare tutti i moduli e le dipendenze necessarie.

Esempio:

{
  "compilerOptions": {
    "rootDir": "src"
  }
}

strict

L'opzione strict abilita tutte le opzioni di controllo rigoroso dei tipi. È altamente raccomandata per i nuovi progetti TypeScript poiché aiuta a individuare potenziali errori nelle prime fasi del processo di sviluppo. L'abilitazione della modalità strict impone regole di controllo dei tipi più severe, portando a un codice più robusto e manutenibile. È una buona pratica abilitare la modalità strict in tutti i nuovi progetti TypeScript.

Esempio:

{
  "compilerOptions": {
    "strict": true
  }
}

esModuleInterop

L'opzione esModuleInterop abilita l'interoperabilità tra i moduli CommonJS e ES. Questo è importante per i progetti che utilizzano entrambi i tipi di moduli. Quando esModuleInterop è abilitato, TypeScript gestirà automaticamente le differenze tra i moduli CommonJS e ES, rendendo più semplice importare ed esportare moduli tra i due sistemi. Questa opzione è particolarmente utile quando si lavora con librerie di terze parti che possono utilizzare sistemi di moduli diversi.

Esempio:

{
  "compilerOptions": {
    "esModuleInterop": true
  }
}

moduleResolution

L'opzione moduleResolution specifica come TypeScript risolve le importazioni dei moduli. I valori comuni includono Node e Classic. La strategia di risoluzione dei moduli Node è quella predefinita e si basa sull'algoritmo di risoluzione dei moduli di Node.js. La strategia di risoluzione dei moduli Classic è più vecchia e meno utilizzata. L'uso della strategia di risoluzione dei moduli Node garantisce che TypeScript possa risolvere correttamente le importazioni dei moduli in un ambiente Node.js.

Esempio:

{
  "compilerOptions": {
    "moduleResolution": "Node"
  }
}

baseUrl e paths

Le opzioni baseUrl e paths vengono utilizzate per configurare la risoluzione dei moduli per le importazioni non relative. L'opzione baseUrl specifica la directory di base per la risoluzione dei nomi dei moduli non relativi. L'opzione paths consente di mappare i nomi dei moduli a posizioni specifiche nel file system. Queste opzioni sono particolarmente utili per progetti con una struttura di directory complessa e per semplificare le importazioni dei moduli. L'uso di baseUrl e paths può rendere il codice più leggibile e manutenibile.

Esempio:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@components/*": ["src/components/*"],
      "@utils/*": ["src/utils/*"]
    }
  }
}

Opzioni Include ed Exclude

Le opzioni include e exclude specificano quali file devono essere inclusi nella compilazione e quali devono essere esclusi. Queste opzioni utilizzano pattern glob per abbinare i nomi dei file. L'uso di include e exclude consente di controllare quali file vengono elaborati dal compilatore TypeScript, migliorando le prestazioni di compilazione e riducendo gli errori. È una buona pratica specificare esplicitamente i file da includere nella compilazione.

Esempio:

{
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

Opzione Extends

L'opzione extends consente di ereditare le opzioni del compilatore da un altro file tsconfig.json. Ciò è utile per condividere impostazioni di configurazione comuni tra più progetti o per creare configurazioni di base. L'uso dell'opzione extends promuove il riutilizzo del codice e riduce la duplicazione. È una buona pratica creare configurazioni di base ed estenderle nei singoli progetti.

Esempio:

{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "jsx": "react-jsx"
  },
  "include": ["src/**/*"]
}

Configurazioni Avanzate

Oltre alle opzioni essenziali del compilatore, tsconfig.json supporta configurazioni avanzate per scenari specializzati.

Compilazione Incrementale

Per progetti di grandi dimensioni, la compilazione incrementale può migliorare significativamente i tempi di compilazione. TypeScript può memorizzare nella cache i risultati delle compilazioni precedenti e ricompilare solo i file che sono stati modificati. Abilitare la compilazione incrementale può ridurre drasticamente i tempi di compilazione per progetti di grandi dimensioni. Ciò è particolarmente importante per progetti con un gran numero di file e dipendenze.

{
  "compilerOptions": {
    "incremental": true,
    "tsBuildInfoFile": ".tsbuildinfo"
  }
}

Riferimenti di Progetto

I riferimenti di progetto consentono di strutturare grandi progetti TypeScript in moduli più piccoli e indipendenti. Ciò può migliorare i tempi di compilazione e l'organizzazione del codice. L'uso dei riferimenti di progetto può rendere i grandi progetti più gestibili e facili da manutenere. È una buona pratica utilizzare i riferimenti di progetto per progetti grandi e complessi.

{
  "compilerOptions": {
    "composite": true
  },
  "references": [
    { "path": "./module1" },
    { "path": "./module2" }
  ]
}

Definizioni di Tipo Personalizzate

A volte, potrebbe essere necessario fornire definizioni di tipo per librerie JavaScript che non ne dispongono. È possibile creare file .d.ts personalizzati per definire i tipi per queste librerie. La creazione di definizioni di tipo personalizzate consente di utilizzare librerie JavaScript nel codice TypeScript senza sacrificare la sicurezza dei tipi. Ciò è particolarmente utile quando si lavora con codice JavaScript legacy o librerie che non forniscono le proprie definizioni di tipo.

// custom.d.ts
declare module 'my-library' {
  export function doSomething(x: number): string;
}

Buone Pratiche

Risoluzione dei Problemi Comuni

La configurazione di tsconfig.json può talvolta essere impegnativa. Ecco alcuni problemi comuni e le loro soluzioni:

Problemi di Risoluzione dei Moduli

Se si riscontrano errori di risoluzione dei moduli, assicurarsi che l'opzione moduleResolution sia configurata correttamente e che le opzioni baseUrl e paths siano impostate in modo appropriato. Controllare due volte i percorsi specificati nell'opzione paths per assicurarsi che siano corretti. Verificare che tutti i moduli necessari siano installati nella directory node_modules.

Errori di Tipo

Possono verificarsi errori di tipo se le definizioni di tipo sono errate o mancanti. Assicurati di avere le definizioni di tipo corrette installate per tutte le librerie che stai utilizzando. Se stai usando una libreria JavaScript che non ha definizioni di tipo, considera la possibilità di creare definizioni di tipo personalizzate.

Errori di Compilazione

Possono verificarsi errori di compilazione se ci sono errori di sintassi o di tipo nel tuo codice TypeScript. Rivedi attentamente i messaggi di errore e correggi eventuali errori di sintassi o di tipo. Assicurati che il tuo codice segua le convenzioni di codifica di TypeScript.

Conclusione

Un file tsconfig.json ben configurato è essenziale per il successo di un progetto TypeScript. Comprendendo le opzioni essenziali del compilatore e le configurazioni avanzate, puoi ottimizzare il tuo flusso di lavoro di sviluppo, migliorare la qualità del codice e garantire la compatibilità con l'ambiente di destinazione. Investire tempo nella corretta configurazione di tsconfig.json ripagherà nel lungo periodo riducendo gli errori, migliorando la manutenibilità e snellendo il processo di compilazione. Ciò si traduce in uno sviluppo software più efficiente e affidabile. Le informazioni qui fornite sono progettate per essere universalmente applicabili e dovrebbero fornire una solida base per avviare un nuovo progetto con TypeScript.

Ricorda di consultare la documentazione ufficiale di TypeScript per le informazioni più aggiornate e le spiegazioni dettagliate di tutte le opzioni del compilatore disponibili. La documentazione di TypeScript è una risorsa preziosa per comprendere le complessità della configurazione di TypeScript.