IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

La version stable de TypeScript 3.7.0 est disponible
Et apporte diverses fonctionnalités et quelques améliorations au langage

Le , par Bill Fassinou

145PARTAGES

3  0 
Microsoft a publié ce mardi la version stable de TypeScript 3.7.0. Comme la version bêta publiée en octobre dernier, TypeScript 3.7.0 apporte diverses nouvelles fonctionnalités et quelques améliorations au langage, notamment l’opérateur de coalescence null « ?? », l'opérateur de chaînage d'optionnels « ?. », etc., et une meilleure prise en charge des fonctions never-Returning. Cette nouvelle version de TypeScript apporte également d’autres fonctionnalités telles que les fonctions d’assertions et les alias de types récursifs.

TypeScript est un langage de programmation libre et open source et un surensemble de JavaScript développé par Microsoft qui a pour but d'améliorer et de sécuriser la production de code JavaScript. TypeScript 3.6.0 est sorti en août avec de nouvelles fonctionnalités et améliorations pour le langage. TypeScript 3.6.0 a introduit une vérification plus stricte pour les itérateurs et pour les fonctions du générateur. Dans les versions précédentes, les utilisateurs de générateurs ne pouvaient pas différencier si une valeur était cédée ou renvoyée par un générateur.

Microsoft a aussi apporté dans TypeScript 3.6.0 une utilisation plus améliorée des tableaux et une amélioration de l’UX en retouchant la classe Promise. Après la bêta de TypeScript 3.7.0 publié au début du mois passé, Microsoft annonce à présent la disponibilité de la version stable. Voici de quoi il s’agit dans TypeScript 3.7.0 :

l'opérateur de chaînage d'optionnels (?.)

Une autre fonctionnalité importante de cette version est le chaînage optionnel. Le chaînage optionnel vous permet d'écrire du code où vous pourrez immédiatement arrêter d'exécuter certaines expressions si vous rencontrez une valeur null ou undefined. La fonctionnalité est disponible avec l'opérateur de chaînage d'optionnels (?.). En fait, l'opérateur de chaînage d'optionnels (?.) permet de parcourir des structures similaires à des arbres de façon élégante : si l’une des propriétés intermédiaires est null ou undefined, la chaîne entière est alors évaluée comme undefined.

Les développeurs qui sont habitués aux langages de programmation comme le C# de Microsoft ou le langage Swift d’Apple connaissent cet opérateur puisque celui-ci est pris en charge par ces langages. À contrario, sa prise en charge continuait à se faire attendre sous TypeScript, mais il est clair désormais qu'elle ne le restera plus pour longtemps et apparaîtra certainement dans TypeScript 3.7.0. Microsoft travaille sur la prise en charge de cet opérateur dans la version stable TypeScript 3.7.0 qui sera livrée dans les prochaines semaines.


La coalescence null

D’après l’équipe de développement de TypeScript, l'opérateur de coalescence null est une fonctionnalité ECMAScript à venir qui va de pair avec le chaînage optionnel. Vous pouvez penser à l’opérateur de coalescence null (??) comme un moyen de revenir à une valeur par défaut lorsque vous traitez avec null ou undefined. Lorsque l’on écrit un code comme : let x = foo ?? bar(); par exemple, c'est une nouvelle façon de dire que la valeur foo sera utilisée quand elle est existe, mais quand elle est nulle ou non définie, la valeur de bar() sera retournée.

En effet, l'opérateur de coalescence null est un opérateur binaire qui fait partie de la syntaxe d'une expression conditionnelle de base dans plusieurs langages de programmation, dont C#, Perl à partir de la version 5.10, Swift, etc. Si son comportement varie selon l'implantation, l'opérateur de coalescence null rend généralement le résultat du premier opérande à gauche si celui-ci existe et n'est pas nul, sinon renvoie le deuxième opérateur. Ce comportement permet de définir une valeur par défaut pour les cas où une valeur plus spécifique n'est pas disponible.

De même, l'opérateur de coalescence null (??) a été également ajouté dans le langage de programmation PHP à partir de sa version 7.0.0, publiée en décembre 2015, en tant que sucre syntaxique pour le cas courant de besoin d'utiliser un ternaire en conjonction avec isset(). Il retourne son premier opérande s'il existe et n'est pas nul ; sinon, il retourne son deuxième opérande. Selon l’équipe de développement de TypeScript, l'opérateur ?? peut remplacer l'utilisation de || lorsque vous essayez d'utiliser une valeur par défaut.

Les fonctions d’assertion

Selon l’équipe de développement, il y a un ensemble spécifique de fonctions qui lancent une erreur si quelque chose d'inattendu se produit. C'est ce qu'on appelle les fonctions d'assertion. À titre d'exemple, Node.js a une fonction dédiée pour cela qui est appelée assert(). Les assertions en JavaScript sont souvent utilisées pour éviter que des types incorrects ne soient transmis. Ces fonctions existent également dans d’autres langages de scripts comme le PHP. Les fonctions d'assertion sont généralement utilisées dans le contexte d'une étape décisionnelle plutôt que comme élément d'action de la fonction.
Une meilleure prise en charge des fonctions never-Returning

Selon Microsoft, dans le cadre du travail concernant les fonctions d'assertion, TypeScript avait besoin d'encoder plus d'informations sur l'endroit et les fonctions appelées. TypeScript avait introduit un type never, qui indique les valeurs qui ne se produiront jamais. Le type never est utilisé lorsque vous êtes sûr que quelque chose ne se produira jamais. Par exemple, vous écrivez une fonction qui ne reviendra pas à son point final ou qui lève toujours une exception. Le type void peut avoir undefined ou null comme valeur, mais never ne peut jamais avoir de valeur. TypeScript 3.7.0 améliore l'utilisation de ces fonctions.

Les alias de type récursif

Les alias de types ont toujours eu une limite quant à la manière dont ils pouvaient être référencés « de manière récursive ». La raison en est que toute utilisation d'un alias de type doit pouvoir se substituer à celle de tout autre alias. Actuellement, les interfaces peuvent être récursives, mais leur expressivité est limitée, ce qui n'est pas le cas des alias de type. Cela signifie qu'en ce moment, vous devez combiner les deux : définir un alias de type, et extraire les parties récursives du type dans les interfaces. Ça marche, mais cela semble désordonné.

En effet, les interfaces supplémentaires ne sont là que parce qu'elles sont nécessaires pour contourner la limitation de récursivité. Selon l’équipe de développement, TypeScript 3.7.0b résout ce problème avec l’ajout des alias de type récursif. La note de version de TypeScript 3.7.0b en dit plus à ce sujet. Pour activer les modèles d'alias de type récursif décrits ci-dessus, la propriété typeArguments a été supprimée de l'interface TypeReference. Les utilisateurs devraient plutôt utiliser la fonction getTypeArguments sur les instances TypeChecker.

Édition sans construction avec des références de projet

Selon l'équipe de développement, les références de projets de TypeScript fournissent un moyen facile de décomposer les bases de code pour donner des compilations plus rapides. Cependant, éditer un projet dont les dépendances n'avaient pas été construites (ou dont la sortie n'était pas à jour) signifiait que l'expérience d'édition ne fonctionnerait pas bien. À partir de TypeScript 3.7.0, lors de l'ouverture d'un projet avec des dépendances, TypeScript utilisera automatiquement les fichiers source.ts/.tsx à la place.

Cela signifie que les projets utilisant des références de projet bénéficieront désormais d'une meilleure expérience d'édition où les opérations sémantiques sont à jour et juste fonctionnelles. Si vous le souhaitez, vous pouvez désactiver ce comportement avec l'option du compilateur disableSourceOfProjectReferenceRedirect, ce qui peut être approprié lorsque vous travaillez sur de très grands projets où ce changement peut avoir un impact sur les performances d'édition.

L’option de formatage du point-virgule

Selon l’équipe de développement du langage, le formateur intégré de TypeScript prend désormais en charge l'insertion et la suppression de points-virgules aux emplacements où un point-virgule final est facultatif en raison des règles d'insertion automatiques de point-virgule (ASI) de JavaScript. Le paramètre est maintenant disponible dans Visual Studio Code Insiders et le sera dans Visual Studio 16.4 Preview 2 dans le menu Outils -> Options. Le choix d'une valeur entre “insert” et “remove” affecte également le format des importations automatiques, des types extraits et autres codes générés fournis par les services TypeScript.

Si vous laissez le paramètre sur sa valeur par défaut “ignore”, le code généré correspond à la préférence de point-virgule détectée dans le fichier en cours. Par ailleurs, il existe également d’autres fonctionnalités et améliorations présentées par Microsoft dans cette version de TypeScript 3.7.0. On peut citer : les contrôles de fonctions non appelées, les changements sur le DOM, etc. Alors quelle est la prochaine étape ? Parallèlement à la publication de TypeScript 3.7.0, Microsoft a aussi lancé les travaux portant sur la version 3.8.0 du langage.

« Nous avons récemment publié le plan d'itération pour TypeScript 3.8, et nous mettrons à jour notre feuille de route à mesure que nous aurons plus de détails. Nous voulons que nos utilisateurs ressentent vraiment de la joie quand ils écrivent du code, et nous espérons que TypeScript 3.7 fait exactement cela », a écrit Daniel Rosenwasser, le gestionnaire de programme TypeScript chez Microsoft.

Source : Microsoft

Et vous ?

Qu'en pensez-vous ?
Comment appréciez-vous la version 3.7 de TypeScript ?

Voir aussi

La version bêta de TypeScript 3.7.0 est disponible avec la prise en charge de l'opérateur de chaînage d'optionnels (?.) et l'opérateur (??)

Typescript 3.7.0 va prendre en charge l'opérateur de chaînage d'optionnels (?.), en s'appuyant sur le 3e draft pour JavaScript

TypeScript 3.6 est disponible et apporte le support de import.meta dans SystemJS et des API qui prennent en charge --build et --incremental

PHP 7.0.0 officiellement disponible

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Sat7121
Membre à l'essai https://www.developpez.com
Le 06/11/2019 à 10:21
L'intérêt de ?? au lieu de || est de différencié le null du false :

foo || bar ne permet pas de savoir si foo vaut false ou null

foo ?? bar indique que l'on veut bar que si et seulement si foo est null.
2  0 
Avatar de goldbergg
Membre averti https://www.developpez.com
Le 06/11/2019 à 10:38
Sur le playground https://www.typescriptlang.org/

Ce code :
Code : Sélectionner tout
1
2
3
4
var a: number = 0;
var b = a ?? 1;
var c = a || 1;
console.log(a, b, c);
est convertie en :

Code : Sélectionner tout
1
2
3
4
5
"use strict";
var a = 0;
var b = (a !== null && a !== void 0 ? a : 1);
var c = a || 1;
console.log(a, b, c);//0 0 1
Le ?? est plus sur que le ||
2  0 
Avatar de Goliver
Futur Membre du Club https://www.developpez.com
Le 09/11/2019 à 20:53
Aaah ! Super pour le ??, je l'attendais celui là !
1  0 
Avatar de grunk
Modérateur https://www.developpez.com
Le 06/11/2019 à 8:56
Quel est l'intérêt de "??" par rapport à || ?

On est bien d'accord que ces 2 solutions sont identiques ?
Code : Sélectionner tout
let x = foo ?? bar();
Code : Sélectionner tout
let x = foo || bar();
0  0 
Avatar de julienzk
Futur Membre du Club https://www.developpez.com
Le 06/11/2019 à 13:01
@goldbergg

Il est plus sur dans le sens ou il interprète pas la première valeur comme une "falsy/truthy".
D'ou la différence dans ton exemple entre b et c.

Edit: J'avais mal lu ton message, j'avais cru à une question ...
0  0