130 votes

Besoin d'une clarification des options du compilateur target et lib

Les options target et lib et leur interaction avec les fonctionnalités prises en charge dans le code source me laissent perplexe. J'ai l'impression que la documentation doit être un peu améliorée et je pose donc la question ici avant de soulever un problème.

J'ai naïvement supposé que target spécifie la version de JS dont le code de sortie a besoin pour s'exécuter (avec l'ajout d'un chargeur de modules). Ainsi, nous pouvons toujours utiliser toutes les fonctionnalités avancées de JS (comme la propagation d'objets) que TS supporte dans notre source et le compilateur génère un code adapté à la cible que nous spécifions. Je suppose qu'il avait des polyfills etc à portée de main et que le code s'exécutait simplement sur la VM cible.

Cependant, la documentation de l'option lib précise que les librairies par défaut dépendent de la cible. Mais, les librairies affectent les types de sources disponibles et donc le code que nous pouvons utiliser. Ainsi, les caractéristiques des sources que nous pouvons utiliser dépendent de la cible. Ce n'est pas ce que j'attendais. Je dois dire que ma compréhension des libs est qu'ils sont des types avec une API différente, bien que les docs ne disent pas vraiment ce qu'ils sont.

Je constate qu'il y a des caractéristiques du langage qui ne dépendent pas des types et d'autres qui en dépendent. Cependant, il n'est pas clair si cela fait partie de la raison de cette situation.

Quelqu'un peut-il clarifier ce point ?

Une question secondaire est de savoir pourquoi il existe à la fois une librairie ES6 et une librairie ES2015 alors qu'elles sont habituellement documentées comme étant la même chose.

merci

216voto

Aaron Points 14679

(Ceci a commencé comme un commentaire mais il est devenu trop long).

C'est un peu confus, en partie parce qu'il y a une certaine histoire derrière tout ça. Je ne suis pas qualifié pour répondre à cette question avec autorité, mais j'ai suivi TypeScript depuis le début de son développement et c'est ce que je comprends :

  • --target indique au compilateur la version de la bibliothèque à inclure lors de la compilation (par exemple ES5 donnera une erreur de compilation si vous utilisez Promise mais ES6 saura tout sur Promise ) et quelle est la version de JS émis par le compilateur (par exemple ES5 décompilera la syntaxe des classes, mais ES6 le laissera en place).
  • --lib a été ajouté plus tard pour vous donner un meilleur contrôle sur la version de la bibliothèque à utiliser lors de la compilation. sans modifier la cible JS émise . Par exemple, un problème courant était que vous pouvez inclure des polyfills pour les fonctionnalités de la bibliothèque ES6, telles que Promise mais vous voulez cibler les navigateurs ES5 en réduisant la compilation. class syntaxe. Avant --lib était dans le coin, vous deviez soit cibler ES6 pour éviter les erreurs de compilation concernant Promise puis la compilation descendante à nouveau en utilisant Babel, ou vous pouvez cibler ES5 et fournissez votre propre définition de type pour Promise afin que le compilateur ne vous donne pas d'erreur. Maintenant avec --lib vous pouvez simplement dire que votre --target ES5 et --lib ES6 et le compilateur ne se plaindra pas de Promise mais toujours compilé en ES5.
  • Aucune de ces options n'obligera TS à émettre des polyfills de bibliothèque ( Promise ), comme vous l'avez manifestement découvert ; il est de votre responsabilité de fournir les bibliothèques d'exécution correctes. Il n'émet que quelques aides à la compatibilité linguistique de bas niveau, comme __extends et __awaiter (la différence étant que class ou async n'est pas seulement une API qui peut être polyfillie à l'exécution, c'est une fonctionnalité du langage avec des implications syntaxiques). Le site --lib est simplement votre moyen d'obtenir le bon niveau de vérification de la compilation en fonction de ce que vous savez que vous aurez au moment de l'exécution.
  • Quant à savoir pourquoi il y a les deux ES6 et ES2015 mais c'est juste parce que ECMAScript a changé de nom et que TS a laissé l'ancien nom comme une option valide pour la rétrocompatibilité :).

Vous trouverez beaucoup d'informations à ce sujet dans ces numéros de TS :

TSConfig Liens de référence :

3 votes

Merci pour cette excellente réponse. Je vois donc que les racines de la confusion sont les suivantes -target fait ces 2 choses, plus certaines fonctionnalités du langage sont down-compilées alors que d'autres ne le sont pas mais nécessitent une librairie pour être utilisées dans le source.

2 votes

Cela répond également à une autre question - pourquoi diable utiliser TS ET Babel :) Ainsi, une bonne façon de cibler de nombreux navigateurs actuels est de cibler ES6 dans TS avec Babel transposant vers ES5.

0 votes

@Aaron Dans ma version de TypeScript, lib.es6.d.ts et lib.es2015.d.ts sont légèrement différents. ES6 est défini comme es2015 (langage) avec dom, dom.iterable, webworker.importscript et scripthost.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X