web-dev-qa-db-fra.com

TypeScript recommandé pour le noeud 8

Quelle est la configuration recommandée pour TypeScript si je veux utiliser les sources compilées avec le noeud 8?

la plupart des tutoriels utilisent les méthodes suivantes tsconig.json :

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs"
  }
}

Mais maintenant, j'ai compris que toutes les fonctionnalités disponibles ne sont pas supportées. Par exemple, ['foo'].includes('bar') renvoie l'erreur: La propriété 'includes' n'existe pas pour le type 'chaîne []'.

J'ai trouvé un problème qui résout ce problème. La solution consiste à utiliser la lib es7. Je pourrais écraser les bibliothèques par défaut: "lib": ["es7"]

Mais je ne suis pas sûr qu'il s'agisse de la meilleure configuration pour le noeud 8 - existe-t-il d'autres fonctionnalités qui ne sont pas prises en charge par cette bibliothèque? y a-t-il trop de fonctionnalités définies?

Ma question est donc la suivante: quelles sont les meilleures configurations pour target, lib et module si je veux utiliser le noeud 8?

48
Xenya

À partir de Node.js 8.10.0, 100% de ES2017 est pris en charge. Si vous savez que vous ciblez cette version ou une version plus récente, la configuration optimale devrait ressembler à ceci:

  • "module": "commonjs"

    Node.js est sur le point d'ajouter des modules ES, mais pour le moment, nous devons nous en tenir à CommonJS.

  • "target": "es2017"

    Cela indique à TypeScript qu'il est correct de générer du JavaScript syntaxe avec les fonctionnalités de ES2017. En pratique, cela signifie par exemple sortie async/await au lieu d’incorporer un polyfill (__awaiter).

  • "lib": ["es2017"]

    Cela indique à TypeScript qu'il est correct d'utiliser fonctions et propriétés introduit dans ES2017 ou une version antérieure. En pratique, cela signifie que vous pouvez utiliser par exemple Array.prototype.includes et String.prototype.padStart.

La configuration complète serait donc:

{
  "compilerOptions": {
    "lib": ["es2017"],
    "module": "commonjs",
    "target": "es2017"
  }
}
82
Linus Unnebäck

Je suis sûr que vous avez déjà trouvé cela, mais le modèle de départ de Microsoft est ici: https://github.com/Microsoft/TypeScript-Node-Starter

Tant que vous êtes toujours sur Node 8.x, conservez votre module sur commonjs, target peut être es6.

compilerOptions.lib définit uniquement les déclarations que le compilateur utilise pour les contrôles de compilation, cela n’affecte pas la sortie de tsc. En d’autres termes, vous pouvez utiliser ce que vous voulez lib et ne vous inquiétez pas du fait que votre code transpilé sera différent (ceci est entièrement contrôlé par compilerOptions.target).

En utilisant es7 comme lib dans votre cas ira bien et vous donnera des déclarations de type pour ES7 et moins.

Array.includes est ES7 (ES2016) et, comme vous l'avez découvert, ne fait pas partie de ES6. Vous pouvez définir votre lib comme; lib: ["es6", "ES2016.Array.Include"] pour contourner votre problème.

2
Robula