Typescript 2.0. Campo “types” in tsconfig.json

Non capisco il significato del campo types in tsconfig.json . Nella documentazione ho letto questo testo:

  "types": { "description": "Type declaration files to be included in compilation. Requires TypeScript version 2.0 or later.", "type": "array", "items": { "type": "string" } }, 

Per quanto, se capisco che installo @types/express dovrei aggiungere tale stringa in tsconfig.json

 { "compilerOptions": { ... "types": ["lodash"] } } 

ma tutto funziona bene senza di esso. E ora non capisco, perché ho bisogno del campo dei types

A partire da TypeScript 2. * il ‘tsconfig.json’ ha le seguenti due proprietà disponibili:

 { 'typeRoots': [], 'types': [] } 

Fornirò dettagli sia in ordine.


  1. ‘typeRoots’ specifica le cartelle di root in cui il transpiler dovrebbe cercare le definizioni dei tipi (es .: ‘node_modules’).

    • Se hai usato typescript, sai che per le diverse librerie che non sono state scritte con typescript, hai bisogno di definizioni perché il compilatore riconosca le variabili globali e abbia il supporto IntelliSense.

    • Questo problema è stato affrontato da progetti (repos) come “DefinatelyTyped” che utilizzano strumenti come il modulo tsd o typings per scaricare le digitazioni richieste per il progetto, ma vengono anche fornite con il proprio file “json” che deve essere gestito separatamente.

    • Con TS2. * Ora puoi recuperare le dipendenze delle definizioni usando ‘npm’. Quindi, invece di usare una libreria cli separata come tsd o digitazioni , ora puoi semplicemente usare: npm i @types/{LIB} questo modo, tutte le dipendenze sono gestite usando package.json e puoi facilmente eliminare la necessità di un altro ‘json’ file da conservare nel tuo progetto.


  1. ‘tipi’ sono i nomi delle librerie reali che saranno trovati in typeRoot.

    • quindi diciamo che hai la configurazione di default per typeRoots che assomiglierebbe a qualcosa:

       "typeRoots": [ "./node_modules/@types" ] 
    • diciamo che ora vuoi usare jasmine come framework di test per il tuo progetto, così hai configurato la tua cartella typeRoot , tutto quello che devi fare ora è eseguire: npm i @types/jasmine --save-dev

    • dopo aver installato il pacchetto di definizioni, devi solo configurare la proprietà ‘tipi’ in ‘tsconfig.json’ come segue:

       "types": [ "core-js", "jasmine", "requirejs", "chance" ] 

Per concludere, in pratica dici al compilatore di TS quanto segue:

typeRoots : devi cercare le tipizzazioni in queste cartelle. tipi : in una delle cartelle sopra riportate, troverai le definizioni per questi framworks (sottocartelle).

Quindi, usando lo scenario sopra, e se aggiungiamo un’altra radice:

 "typeRoots": [ "./node_modules/@types", "./custom_definitions" ], "types": [ "jasmine", ] 

TS ora cercherà i file di definizione in

./node_modules/@types/jasmine

o

./custom_definitions/jasmine

Spero che questo ti aiuti!

Non è necessario necessariamente il campo tipi. Ecco la parte importante da notare dalla documentazione :

Per impostazione predefinita tutti i pacchetti visibili “@types” sono inclusi nella compilation. I pacchetti in node_modules / @ types di qualsiasi cartella che li include sono considerati visibili

Quindi, se hai seguito la convenzione o utilizzato un set di strumenti come npm per scaricare i pacchetti @types, non devi configurare typeRoot o tipi nella configurazione poiché funzionerà immediatamente con la struttura di cartelle predefinita.