web-dev-qa-db-fra.com

Type de police 2.0. champ "types" dans tsconfig.json

Je ne comprends pas la signification de types champ dans tsconfig.json. Dans la documentation, j'ai lu ce texte:

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

Pour autant que je sache si j'installe @types/express Je devrais ajouter une telle chaîne dans tsconfig.json

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

mais tout fonctionne bien sans cela. Et maintenant, je ne comprends pas pourquoi j'ai besoin du champ types

42
Stalso

A partir de TypeScript 2. * le 'tsconfig.json' a les deux propriétés suivantes disponibles:

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

Je détaillerai les deux dans l'ordre.


  1. 'typeRoots' spécifie les dossiers racine dans lesquels le transpiler doit rechercher les définitions de type (par exemple: 'node_modules').

    • Si vous utilisiez TypeScript, vous savez que, pour différentes bibliothèques n'ayant pas été écrites à l'aide de TypeScript, vous avez besoin de définitions pour que le compilateur puisse reconnaître les variables globales et bénéficier du support IntelliSense.

    • Ce problème a été résolu par des projets (repos) tels que 'DefinatelyTyped' qui utilisent des outils tels que tsd ou saisies module pour télécharger les saisies requises pour votre projet, mais elles viennent également avec leur propre fichier 'json' qui doit être maintenu séparément.

    • Avec TS2. *, Vous pouvez désormais extraire les dépendances de définition à l'aide de 'npm'. Donc, au lieu d’utiliser une bibliothèque cli séparée comme tsd ou typings , vous pouvez maintenant utiliser: npm i @types/{LIB} de cette façon, toutes les dépendances sont gérées à l'aide de package.json et vous pouvez facilement éliminer la nécessité d'un autre 'json' fichier à maintenir dans votre projet.


  1. "types" sont les noms de bibliothèque réels qui seront trouvés dans le typeRoot.

    • alors disons que vous avez la configuration par défaut pour typeRoots qui ressemblerait à quelque chose comme:

      "typeRoots": [
          "./node_modules/@types"
      ]
      
    • supposons que vous souhaitiez maintenant utiliser Jasmin comme cadre de test pour votre projet. Ainsi, votre dossier typeRoot est configuré, il ne vous reste plus qu'à exécuter. : npm i @types/jasmine --save-dev

    • une fois le paquet de définition installé, il vous suffit de configurer votre propriété 'types' dans 'tsconfig.json' comme suit:

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

Pour conclure, vous dites essentiellement au compilateur TS:

typeRoots : Vous devez rechercher des saisies dans ces dossiers. types : Dans l'un des dossiers fournis ci-dessus, vous trouverez les définitions de ces framworks (sous-dossiers).

Donc, en utilisant le scénario ci-dessus, et si nous ajoutons une autre racine:

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

TS va maintenant rechercher des fichiers de définition dans

./node_modules/@types/jasmine

ou

./custom_definitions/jasmine

J'espère que cela t'aides!

98
Vlad Jerca

Vous n'avez pas nécessairement besoin du champ types. Voici la partie importante à noter de la documentation :

Par défaut, tous les packages "@types" visibles sont inclus dans votre compilation. Les packages dans node_modules/@ types de tout dossier englobant sont considérés comme visibles

Ainsi, si vous avez suivi la convention ou utilisé un ensemble d'outils tel que npm pour télécharger les packages @types, vous n'avez pas besoin de configurer typeRoots ou tape dans votre configuration car elle fonctionnera immédiatement avec la structure de dossiers par défaut.

23
Xcalibur