Fermer

octobre 9, 2020

Ce qui me passionne dans TypeScript 4.0


C'est maintenant le meilleur moment pour adopter TypeScript. Jetons un coup d'œil à la récente version 4.0 et voyons pourquoi!

TypeScript

TypeScript, un sur-ensemble de JavaScript, est un langage compilé open-source, fortement typé et orienté objet développé et maintenu par l'équipe de Microsoft . TypeScript garantit que même avant d'enregistrer votre code, il est vérifié de type, puis supprime même tous les types pour avoir un JavaScript propre et lisible. Il est également utilisé dans vos éditeurs préférés pour effectuer des tâches telles que la saisie semi-automatique et la refactorisation. TypeScript possède l'une des communautés de développeurs dont la croissance est la plus rapide, et avec la nouvelle version 4.0, il n'y a pas de changements majeurs, c'est donc le meilleur moment pour démarrer avec TypeScript.

Quelques informations générales

TypeScript a enregistré d'énormes croissance au cours des derniers mois avec des nombres de téléchargements mensuels sur npm dépassant les 50 millions en juillet 2020. Il est clair qu'il y a un grand amour pour TypeScript. L'année dernière, l'enquête sur l'état de JavaScript aux développeurs a demandé à des milliers de développeurs de voter TypeScript comme deuxième langage le plus apprécié, et près de 90% disent qu'ils l'utiliseront à nouveau.

Installation de TypeScript

Pour ce nouveau version, les développeurs de TypeScript peuvent l'obtenir via NuGet à ce lien ou utiliser le gestionnaire de packages Node avec cette commande:

 npm install  -  D typescript

Le support IDE pour TypeScript pour cette version est déjà sur Visual Studio et même Visual Studio Code en installant la version I nsiders sur le lien ici .

Cette version du langage s'est concentrée sur une plongée plus profonde dans l'expressivité, la productivité et l'évolutivité et de nombreuses améliorations sur l'expérience autour des tuples. Examinons maintenant un aperçu de certains des changements apportés par cette nouvelle version.

Opérateurs d'affectation de court-circuit

En JavaScript, vous pouvez réécrire les commandes suivantes comme ci-dessous pour des opérations simples comme l'addition, la soustraction, la division et multiplication:



 a  + =  b ; 


a  - =  b ; 


a  * =  b ; 


a  / =  b ; 


a  ** =  b ; 


a  << =  b ; 

TypeScript les prend également en charge et maintenant qu'ECMAScript progresse également et ajoute de nouveaux opérateurs d'affectation comme && = || = et ?? = this nouvelle version livrée avec un support pour eux aussi. Un membre de la communauté Wenlu Wang a apporté cette nouvelle fonctionnalité.

Ces opérateurs sont bons pour permuter et même se conformer au principe DRY. Un exemple d'utilisation serait lorsqu'un utilisateur pourrait écrire du code comme le suivant:

 a  =  a  &&  b ; 
a  =  a  ||  b ; 
a  =  a ? ?  b ; 

Ou même un bloc de code if comme celui-ci ci-dessous:


 si   (!  a )   {
    a  =  b ; 
} 

Pour commencer à l'utiliser, envisagez d'exécuter cet exemple ci-dessous pour voir en quoi cela diffère de toujours l'exécution de l'affectation.

  const  obj  =   {
     obtenir   accessoire  ()   {
        console .  log  ( "getter has run" ) ; 
        
         return  Math .  random  ([19659030])   <  0.5 ; 
    } 
     set   prop  ( _val :   boolean  )   {
        console .  log  ( "setter has run" ) ; 
    } 
} ; 
 function   foo [19659030] ()   {
    console .  log  ( "right side évalué" ) ; 
     return   true ; 
} 
console .  log  ( "Celui-ci exécute toujours le setter" ) ; 
obj .  prop  =  obj .  prop  ||   foo  () ; 
console .  log  ( "Celui-ci * parfois * exécute le setter" ) ; 
obj .  prop  ||  =   foo  () ; 

Labeled Tuple Elements

À partir de cette nouvelle version, Les éléments de tuple seront désormais étiquetés pour améliorer l'expérience et encourager la lisibilité. Ceci est très important car la lisibilité est essentielle. Imaginez un scénario comme celui-ci utilisant un tuple comme paramètre de repos:

  function   foo  ( ...  args :   [ string   numéro ] ) :   void   {
    
} 

Cette déclaration ne doit pas être différente de celle ci-dessous:

  function   foo  ( arg0 :   string  arg1 :   numéro ) :   void   {
    
} 

pour tout moment foo doit être appelé.

  foo  ( "hello"   42 ) ;  
 foo  ] ( "bonjour"   42   vrai ) ;  
 foo  ( "bonjour" ) ; 

Nous voyons à quel point la lisibilité peut être importante avec ces derniers. Même si la modélisation de ces derniers n'affectera en aucune façon la vérification de type, il devient plus difficile de l'utiliser sans étiquettes. L'équipe TypeScript a donc expédié des étiquettes pour les tuples.

  type  Range  =   [ start :   number  end :   numéro ] ; 

Pour approfondir encore davantage la relation entre les listes de paramètres et les types de tuple, la syntaxe des éléments restants et des éléments optionnels reflète la syntaxe des listes de paramètres:

  type  Foo  =   [ premier :   numéro  deuxième ? :   string   ...  reste  :   any  [] ] ; 

Une chose à retenir si vous utilisez ces étiquettes est que tous les autres éléments à l'intérieur du tuple doivent être étiquetés.

  type  Bar  =   [ first  :   chaîne   numéro ] ; 


À noter: les libellés ne nous obligent pas à nommer nos variables différemment lors de la déstructuration. Ils sont uniquement là pour la documentation et l'outillage.

Une autre chose à noter est que vous n'avez pas à nommer vos variables différemment lors de la déstructuration car elles existent uniquement pour la documentation.

  function   foo [19659030] ( x :   [ premier :   chaîne  deuxième :   numéro ]  )   {
    
    
     let   [ a  b ]   =  x ; 
    
} 

Pour en savoir plus sur les tuples étiquetés, voir le PR dans le lien ici .

Class Property Inference from Constructors

Dans cette nouvelle version, lorsque vous activez noImplicitAny, TypeScript utilise désormais le flux de contrôle analyse pour déterminer le type des propriétés de vos classes.

  class   Square   {
    
    
    région ; 
    sideLength ; 
     constructeur  ( sideLength :   number )   {
         this .  sideLength  =  sideLength ; 
         this .  area  =  sideLength  **   2 ; 
    } 
} 

Lorsque tous les chemins de constructeur ne sont pas assignés à une instance, TypeScript l'étiquera comme indéfini.

  class   Square   {
    sideLength ; 
     constructeur  ( sideLength :   number )   {
         if   ( Math . [19659033] random  () )   {
             this .  sideLength  =  sideLength ; 
        } 
     } 
     get   area  ()   {
         return   this .  sideLength  **   2 ; 
        
        
    } 
} 

Dans certains cas, comme lorsque vous avez une méthode initialize vous devrez fournir une annotation de type explicite et une assertion d'affectation définie (! ) si vous êtes dans strictPropertyInitialization .

  class   Square   {
    
    
    sideLength ! :   numéro ; 
    
    
     constructeur  ( sideLength :   numéro )   {
         this [19659030].  initialize  ( sideLength ) 
    } 
     initialize  ( sideLength :   number )   {
         this .  sideLength  =  sideLength ; 
    } 
     get   area  ()   {[19659201] renvoie   this .  sideLength  **   2 ; 
    } 
} 

Custom JSX Factories

In JSX, a fragment est un élément utilisé comme balise englobante pour vous permettre de renvoyer plusieurs éléments enfants. Cela a été implémenté dans TypeScript il y a quelque temps, mais après que l'équipe de TypeScript ait vu à quel point il était adopté massivement, ils l'ont rendu encore plus facile à utiliser. Cette nouvelle version de TypeScript permet aux développeurs de personnaliser la fabrique de fragments via l'option jsxFragmentFactory désormais disponible.

Voir cet exemple. Le fichier tsconfig.json ci-dessous indique à TypeScript de transformer JSX d'une manière compatible avec React, mais bascule chaque appel d'usine sur h au lieu de React.createElement et utilise Fragment au lieu de React.Fragment .

 {
   "compilerOptions" :   {
     "target" : [19659287] "esnext" 
     "module" :   "commonjs" 
     "jsx" :   "react" [19659285] "jsxFactory" :   "h" 
     "jsxFragmentFactory" :   "Fragment" 
  } 
} 

Il peut y avoir des cas où vous devez avoir une fabrique JSX différente sur chaque fichier, vous pouvez maintenant utiliser le nouveau commentaire pragma / ** @jsxFrag * / . Comme ceci:





 import   { h  Fragment }   from   "preact" ; 
 let  stuff  =   <> 
     < div >  Bonjour  < /  div > 
 < / > ; 

Ceci est remplacé par la sortie JavaScript ci-dessous:





 import   { h  Fragment }   from   "preact" ; 
 let  stuff  =   h  ( Fragment   null 
     h  ( "div"   null   "Hello" ) ) ; 

Speed ​​Improvements in build Mode

Auparavant, la compilation du code TS après une compilation précédente avait été faite avec des erreurs sous l'indicateur incrémental serait extrêmement lent lorsque vous utilisiez l'indicateur noEmitOnError. Cela est normalement dû au fait qu'aucune mise en cache n'est effectuée pour la session de compilation précédente. Cela change dans cette nouvelle version de TypeScript car ces scénarios ont maintenant une augmentation de vitesse en mode build .

Cette nouvelle version vous permet également d'utiliser l'indicateur noEmit lorsque vous voulez faire une compilation incrémentielle. Cela n'était pas autorisé auparavant; cependant, c'est maintenant, car la vitesse est devenue une priorité dans ce cas.

Conclusion

C'est un ensemble de fonctionnalités qui me passionnent dans la nouvelle version 4.0 de TypeScript. La prochaine itération est déjà en cours pour la version 4.1 et vous pouvez voir la progression ici . Il est important de souligner le travail effectué dans la version par les contributions des membres de la communauté. La communauté TypeScript est l'une des meilleures que j'ai vues et ne cesse de croître. Quelle est votre nouvelle fonctionnalité préférée?





Source link