TypeScript 1.6 autorise les fusions de types et les classes abstraites

TypeScript 1.6 autorise les fusions de types et les classes abstraites

Il n'y a qu'à puiser dans les demandes des développeurs

Avatar de l'auteur
Vincent Hermann

Publié dans

Logiciel

18/09/2015 2 minutes
31

TypeScript 1.6 autorise les fusions de types et les classes abstraites

Les développeurs peuvent désormais récupérer la version 1.6 du langage TypeScript. Il s’agit pour rappel d’un sur-ensemble typé du JavaScript, conçu initialement pour aider à la gestion des gros projets. Parmi les améliorations, on notera en particulier la possibilité de définir une classe à l’aide d’une expression.

TypeScript 1.6 permet donc de déclarer une classe avec une expression, qui peut d’ailleurs être anonyme. Microsoft, à l’origine de ce langage (libre et open source), indique que cet ajout fait suite au travail de compatibilité pour aligner le socle fonctionnel avec le standard ECMAScript 6.

La nouvelle version permet également la création d’un nouveau type composite, résultant d’un mélange entre deux autres types. Cette intersection de types diffère de l’union qui était déjà possible, mais dont le fonctionnement pouvait se révéler problématique si les développeurs souhaitaient simplement fusionner des types génériques. Les intersections peuvent se créer via le nouvel opérateur « & ».

typescript

Les classes abstraites ou partiellement abstraites font elles aussi leur apparition, Microsoft précisant d’ailleurs qu’il s’agit d’une fonctionnalité réclamée depuis longtemps par les développeurs. Même chose pour les alias de types génériques et des gardes de types personnalisées. Avec ces dernières, les développeurs pourront définir leurs propres gardes de types via des fonctions et le mot « is ».

TypeScript 1.6 peut être téléchargée pour Visual Studio 2015, Visual Studio 2013 ou en tant que paquet NPM. Ses sources sont également disponibles sur GitHub.

Écrit par Vincent Hermann

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Le brief de ce matin n'est pas encore là

Partez acheter vos croissants
Et faites chauffer votre bouilloire,
Le brief arrive dans un instant,
Tout frais du matin, gardez espoir.

Fermer

Commentaires (31)


Ça fait plaisir de voir ce langage progresser de plus en plus vite au rythme que sa popularité augmente.

La syntaxe et l’aspect “transpilateur de JS” me rebutait pas mal au debut (par rapport à dart), mais je songe de plus en plus à m’y mettre…


J’utilise TypeScript depuis quelques mois et c’est vraiment bien. Quel dommage de ne pas avoir mis les types non-nullable :&nbsphttps://github.com/Microsoft/TypeScript/issues/185



Microsoft a bien change : code source sur GitHub, lancement d’un éditeur multiplateforme - mais malheureusement pas open source - Visual Studio Code (qui n’a rien a voir avec Visual Studio), C# en open source… Ca va dans le bon sens. Ils sont presents la ou on ne les attendait pas il y a encore peu de temps.



Quelqu’un a essaye le concurrent de TypeScript : Flow de Facebook ? (qui lui gere les types non-nullable)


AngularsJS 2 est écrit en Typescript donc si vous faites du développement Web, il va falloir s’y mettre …


Comme concurrent tu as babeljs.io


Marrant qu’un produit Google utilise une techno Microsoft. ^^








dodo021 a écrit :



Comme concurrent tu as babeljs.io





Rien a voir. Le principal intérêt de TypeScript est de proposer le typage statique (d’ou son nom) : let toto: String = 'Hello' vs let toto = 'Hello'. On pourrait imaginer que TypeScript soit une surcouche a Babel (ca a meme ete propose : https://github.com/Microsoft/TypeScript/issues/1641 ).









acpirience a écrit :



AngularsJS 2 est écrit en Typescript donc si vous faites du développement Web, il va falloir s’y mettre …





Ou pas. Angular 2 est certes écrit en TypeScript mais rien ne t’empêche de l’utiliser en codant en ES5 ou ES6 ou ES7, ES… Tout comme n’importe quel projet TypeScript d’ailleurs. Tu peux meme coder en Dart et utiliser Angular 2 si tu veux.



Non, parce que:




  • on peut faire du dev web sans angular.

    - rien ne garantie que angular 2 deviendra aussi populaire que angularjs (y’a d’autres alternatives qui sont sorties entre temps)…

    -On peut utiliser angular 2 en js, meme si, celon le dernier sondage une majorité ecrasante de gens l’utilisent en ts (mais faut etre logique, les gens  qui utilisent des framework en beta sont pas du genre “conservateur”, donc normal qu’ils utilisent tous “le langage alternatif nouveau”…)








tanguy_k a écrit :



…ancement d’un éditeur multiplateforme - mais malheureusement pas open source - Visual Studio Code (qui n’a rien a voir avec Visual Studio)…





Bah tu prends par exemple Atom.io tu installes les plugins qu’ils utilisent dans leur Visual studio code et tu auras la même chose.



Il est possible de combiner du CoffeeScript et du TypeScript ? Je préfère l’écriture Coffee mais j’aimerais bien le typage fort de typeScript.


On sait pas faire du JS du coup on remet des types dedans, mouai, pas prêt de m’y mettre moi.


On disait la même chose de jQuery à l’époque pour le dev web. Aujourd’hui, il y a eu forte tendance à s’en débarrasser. Qui dit que ça ne sera pas la même chose avec Angular hein ? :)








BabyAzerty a écrit :



On disait la même chose de jQuery à l’époque pour le dev web. Aujourd’hui, il y a eu forte tendance à s’en débarrasser. Qui dit que ça ne sera pas la même chose avec Angular hein ? :)





Le plus simple reste d’utiliser le ECMA Script 6 et utiliser un compilateur qui retranscrit en ECMA Script 5.

J’avais envisagé de me mettre à coffee Script mais c’est vrai qu’apprendre un truc trop spécifique je sais pas si c’est vraiment une bonne chose.



Je fait mon rabat-joie, mais vous faites une new pour TypeScript 1.6, mais pas pour Node 4.0.0, je suis pas sur de comprendre la logique :p


Il y a quand même une grande différence entre une application Angular et JQuery. Angular est basé sur les composants, a des services bien définis, un moteur de template intégré, un système de routage…

 

C’est aussi bien plus facile de ne pas utiliser jQuery en 2015 qu’en 2007. Les navigateurs actuels respectent beaucoup mieux les standards et on des comportements plus uniformes. Les APIs JavaScript natives sont aussi plus complètes. document.querySelector est arrivé bien après jQuery par exemple.

 



Pour finir :  tendances entre jQuery et AngularJS sur Google Search








jojofoufou a écrit :



une news pour TypeScript 1.6, mais pas pour Node 4.0.0







+1000

Les news sur tout ce qui tourne autour de Microsoft et Windows sont sur-représentées.

La version 4 de Node.js est hyper importante pour le projet.









jojofoufou a écrit :



Je fait mon rabat-joie, mais vous faites une new pour TypeScript 1.6, mais pas pour Node 4.0.0, je suis pas sur de comprendre la logique :p





Parce que c’est Microsoft qui propose en Open Source, that’s the difference :)



>> La nouvelle version permet également la création d’un nouveau type composite, résultant d’un mélange entre deux autres types.  

 C’est quand même marrant. D’un côté “on” passe sa vie à hurler que l’héritage multiple c’est le mal absolu, et d’un autre côté les mêmes “on” s’ignénient à ajouter à presque tous les langages de programmation une technique détournée pour faire quand-même de l’héritage multiple sans vraiment l’avouer…


Ou pas. Pour l’instant c’est en alpha, il y a plein de choses qui changent de jour en jour, donc à moins de vouloir participer à son développement, rien de sert de courir, il vaut mieux attendre que ce soit stabilisé (en béta).








33A20158-2813-4F0D-9D4A-FD05E2C42E48 a écrit :



>> La nouvelle version permet également la création d’un nouveau type composite, résultant d’un mélange entre deux autres types.  

 C’est quand même marrant. D’un côté “on” passe sa vie à hurler que l’héritage multiple c’est le mal absolu, et d’un autre côté les mêmes “on” s’ignénient à ajouter à presque tous les langages de programmation une technique détournée pour faire quand-même de l’héritage multiple sans vraiment l’avouer…







Y en a encore beaucoup trop qui croient que “Carré hérite de Rectangle”, parce que “un carré est un rectangle particulier”.



Alors passer à l’héritage multiple… <img data-src=" />









127.0.0.1 a écrit :



Y en a encore beaucoup trop qui croient que “Carré hérite de Rectangle”, parce que “un carré est un rectangle particulier”.





Et c’est quoi le problème ?









127.0.0.1 a écrit :



Y en a encore beaucoup trop qui croient que “Carré hérite de Rectangle”, parce que “un carré est un rectangle particulier”.



Alors passer à l’héritage multiple… <img data-src=" />





Si on utilise des types immutables, oui, carré hérite de rectangle, de losange et de polygone_inscrit, qui héritent tous les trois de polygone, tandis que rectangle hérite de trapèze et de parallélogramme…&nbsp;<img data-src=" />

&nbsp;

&nbsp;Si on supprime les fonctionnalités d’un langage pour la simple raison que certains ne la comprennent pas, il faut éliminer pas mal de choses. Idéalement, si on supprimait la possibilité d’exécuter des instructions, je pense qu’on ferait un grand pas dans l’éradication des bugs <img data-src=" />.

&nbsp;









tanguy_k a écrit :



Et c’est quoi le problème ?









33A20158-2813-4F0D-9D4A-FD05E2C42E48 a écrit :



Si on utilise des types immutables, oui, carré hérite de rectangle, de losange et de polygone_inscrit, qui héritent tous les trois de polygone, tandis que rectangle hérite de trapèze et de parallélogramme…







Voila, c’est ce dont je parlais. L’héritage simple est généralement mal utilisé car les gens s’en servent comme d’un template, ou d’une composition. Bref, pour “ factoriser du code” dans la classe mère et le ré-employer dans les classes filles.



Le mot “extends” est à prendre au pied de la lettre. On “étend” les possibilité d’une classe. Une classe “étendue” peut faire plus de choses que la classe mère. Ou, dit autrement, une classe étendue à moins de contraintes que la classe mère.



Un carré à plus de contraintes qu’un rectangle. Donc un carré n’est pas une “extension” d’un rectangle. C’est une “instance” particulière du rectangle.



C’est pour cela que j’insiste sur le fait qu’on se place dans le cas de types immu(t)ables. Dans ces conditions, la dérivation de classes définit des sous-types selon le principe de substitution de Liskov.


Flow me semble plus interessant parce qu’il se limite a apporter le type checking (et type inference) alors que Typescript apporte aussi des choses en plus comme les interfaces. TS a maintenant absorbe ES6, du coup certaines des fonctionalites qu’ils apportaient par dessus ES5 sont un peu dedoublees, c’est confus je trouve. Et perso ES6 apporte deja tout ce que je veux.

De plus Flow semble plus malin, il peut avertir des mauvais usages de la valeur “null” par exemple.

&nbsp;

En gros aujourd’hui je partirais sur Flow parce que c’est facile d’y passer ou de l’enlever sans modifier quoi que ce soit d’autre que les types dans le code (et encore: babel les enleve lui meme, il n’y a rien a faire !)


Rendre l’instance non-mutable c’est juste de la magouille pour éviter d’appliquer des opérations du rectangle sur un carré (par polymorphisme)… et au final de ne plus avoir un carré.



Ca veut dire que le polymorphisme n’est pas applicable car le carré n’a pas de la même “forme” qu’un rectangle, et donc que l’héritage est mal employé.


Un entier est non mutable, il s’agit donc uniquement d’une magouille pour éviter qu’il devienne un flottant ?

&nbsp;

L’immutabilité est un des principes fondamentaux de la programmation fonctionnelle, simplifie le multithreading, le map/reduce, mais tu dois avoir raison, ces techniques c’est une magouille inventée par ceux qui ne savent pas correctement gérer les conditions de course dans un programme.

&nbsp;


C’est vrai que dans le cas Rectangle et Carré une simple fonction/propriété genre “isSquare” peut suffire ^^”



Après ca dépend toujours du code et du programme à coder derrière aussi… parce que la classe Rectangle peut aussi disparaitre au profit de Parallélogramme <img data-src=" />



Je pense quand même que le mieux est un code lisible et compréhensible au final; il faut parfois savoir mettre son égo de coté pour pouvoir travailler en équipe dans de bonnes conditions <img data-src=" /> ; attention, sans laisser passer n’importe quoi non plus <img data-src=" />


Je parlais uniquement du cas présent, c’est à dire rendre l’instance non-mutable pour conserver la sémantique des propriétés géométriques d’un Carré et d’un Rectangle.



Bien sur, avoir des instances non-mutables n’est pas une magouille en soi. Quoiqu’en terme purement objet, ce n’est pas une nécessité pour avoir un programme fonctionne. C’est plutôt un moyen de dire au compilo/runtime “hey, la valeur des attributs ne sera pas modifiée: tu peux vérifier à la compilation que je ne modifie pas les valeurs ? Ah, et tu pourras optimiser les appels au runtime ? Merci.” <img data-src=" />


Tout dépend de l’usage, comme disait Cicéron.

&nbsp;



&nbsp;Et Cicéron, c’est pas un carré.








33A20158-2813-4F0D-9D4A-FD05E2C42E48 a écrit :



Tout dépend de l’usage, comme disait Cicéron.

 



 Et Cicéron, c’est pas un carré.





<img data-src=" />