Angular Ivy, le moteur de rendu d'Angular, apporte des améliorations notables en matière de productivité des développeurs. Ces changements, bien qu'introduits sous la forme de fonctionnalités sous-jacentes techniques, ont un impact direct sur la manière dont les développeurs interagissent avec le cadre Angular, en optimisant à la fois la vitesse, la gestion des erreurs et l'expérience de test. L'un des aspects les plus remarquables d'Ivy est l'amélioration des outils de développement, dont le service de langage Angular, qui inclut la coloration syntaxique dans les templates et les styles des composants. Cela facilite grandement l'utilisation des composants à fichier unique, une caractéristique cruciale dans le développement moderne avec Angular. La gestion des erreurs s'en trouve également optimisée, notamment avec la détection précoce des erreurs de type dans les templates de composants, ce qui permet de garantir une base de code plus robuste et moins sujette aux erreurs lors du déploiement.
L’introduction de la mise en surbrillance de la syntaxe dans les expressions de templates intégrés et dans les styles en ligne, au sein d’Ivy, améliore encore la lisibilité et la traçabilité du code. Par ailleurs, Ivy apporte également la prise en charge des préprocesseurs de style comme Sass dans les styles en ligne via l’option "inlineStyleLanguage" dans les configurations de build d'Angular, comme @angular-devkit/build-angular:browser et @angular-devkit/build-angular:karma. Cette fonctionnalité simplifie la gestion des styles complexes dans les projets Angular, en permettant une intégration plus fluide des outils CSS modernes tout en maintenant une structure claire et cohérente du code.
Cependant, la productivité ne se limite pas uniquement à l'écriture du code : Angular Ivy transforme également l'expérience de test. En offrant des améliorations significatives de vitesse et en intégrant des outils de test plus performants, Ivy aide les développeurs à obtenir des retours plus rapides et plus précis lors des tests unitaires et des tests d'intégration. Le processus de compilation AOT (Ahead-Of-Time) permet de réduire la distance entre les tests et le code en production, créant ainsi un environnement de test plus fidèle au runtime. Cette amélioration est cruciale, car elle réduit les risques de divergences entre le comportement attendu et réel du code.
De plus, Angular Ivy introduit une vérification stricte des types dans les templates, ce qui permet de capturer les erreurs de manière plus rigoureuse, avant même l'exécution du code. Cette fonctionnalité, en conjonction avec les outils de migration automatisée, permet une transition plus fluide entre les différentes versions d'Angular tout en garantissant la stabilité du projet à long terme. Les messages d'erreur produits par Ivy, enrichis d’informations contextuelles détaillées, contribuent également à une meilleure compréhension des erreurs, facilitant ainsi la résolution des problèmes.
L'optimisation de l'expérience IDE est un autre aspect essentiel du développement avec Ivy. Les erreurs de type dans les URL des templates et des styles sont désormais clairement affichées, tandis que les tooltips fournissent des informations précieuses sur les modules Angular utilisés, ce qui améliore la compréhension et la navigation du code. La gestion des erreurs devient plus intuitive, ce qui réduit les barrières à la compréhension et permet aux développeurs de réagir rapidement aux problèmes.
Les concepts explorés dans ce chapitre, tels que la liaison des styles aux éléments via Ivy, la gestion stricte des types, et la capacité de contrôler la priorité des liaisons de styles, sont essentiels pour le développement d’applications complexes. La flexibilité d'Ivy, en permettant des bindings de styles prévisibles et en offrant des outils d’analyse et de débogage plus détaillés, est cruciale pour améliorer la qualité et la maintenabilité du code Angular.
Au-delà de ces améliorations techniques, il est important de souligner que la capacité d’Ivy à simplifier la gestion des dépendances et des décorateurs est fondamentale pour optimiser la structure du code dans des projets Angular à grande échelle. Par exemple, l'introduction de nouveaux scopes de fournisseurs, tels que "any" et "platform", permet de mieux gérer les dépendances à l'échelle du projet, tout en offrant une flexibilité accrue dans la configuration des services au sein de l’application.
Enfin, la mise en œuvre de ces nouvelles fonctionnalités, bien que détaillée ici à travers des exemples simples, nécessite une bonne maîtrise des bases d’Angular, ainsi qu’une compréhension des implications des différentes configurations et outils mis à disposition par Ivy. La gestion des propriétés CSS personnalisées, en particulier, est un domaine qui peut sembler complexe au premier abord, mais qui offre des possibilités impressionnantes lorsque combiné avec Angular. Cette approche permet d’appliquer des modifications de style au runtime, selon le contexte, ce qui offre une grande souplesse dans la gestion dynamique des interfaces utilisateurs.
Comment utiliser l'opérateur de fusion nullish (??) pour gérer les valeurs nulles et indéfinies en TypeScript
L'introduction de l'opérateur de fusion nullish (??) dans TypeScript, à partir de la version 3.7, a apporté une manière plus robuste et explicite de gérer les valeurs nulles et indéfinies dans le langage. Contrairement aux autres opérateurs logiques comme l'OR (||), qui peuvent entraîner des comportements inattendus lorsqu'une valeur "fausse" comme 0 ou une chaîne vide est utilisée, l'opérateur de fusion nullish se limite aux valeurs nulles et indéfinies, ce qui permet d'éviter des erreurs subtiles.
Prenons l'exemple d'une fonction qui définit des valeurs par défaut pour des paramètres comme dans le code suivant :
Ici, l'utilisation de l'opérateur logique || pour attribuer des valeurs par défaut présente un inconvénient majeur : elle considère également toutes les valeurs "fausses" telles que 0, "", false, et NaN comme nulles. Cela signifie que si une valeur de 0 est passée pour régler le volume (par exemple pour mettre le son à zéro), le code forcera la valeur à 0.5, empêchant ainsi de couper complètement le son.
La solution à ce problème réside dans l'utilisation de l'opérateur de fusion nullish, qui ne remplace la valeur que si elle est réellement null ou undefined :
Désormais, si une valeur de 0 est passée pour le volume, celle-ci ne sera pas remplacée par la valeur par défaut, ce qui permet aux utilisateurs de couper le son sans que cela soit perturbé par des valeurs faussement considérées comme invalides.
En JavaScript, les valeurs null et undefined sont souvent appelées "valeurs nullish". Tandis que le format JSON ne prend pas en charge undefined — les propriétés dont la valeur est undefined sont tout simplement omises — de nombreux langages côté serveur possèdent un type null, qui est équivalent à null en JavaScript. Cependant, il existe des API en JavaScript qui acceptent ces valeurs de manière interchangeable, ou qui réagissent différemment selon qu'une valeur null ou undefined est passée.
Dans un langage comme TypeScript, qui permet un typage fort mais peut aussi être assoupli, il est essentiel de s'assurer que les valeurs de types inattendus ne s'introduisent pas dans le système. Par le passé, une solution courante consistait à utiliser une vérification d'égalité lâche pour comparer les valeurs à null ou undefined :
Cette approche fonctionne, mais elle n'est pas aussi précise ni explicite que l'utilisation de la chaîne d'opération ??.
L'opérateur de fusion nullish peut être combiné avec l'opérateur de chaînage optionnel (?.), une autre fonctionnalité puissante de TypeScript, pour offrir encore plus de flexibilité dans la gestion des valeurs manquantes. L'exemple suivant illustre l'utilisation des deux :
Ici, l'opérateur de chaînage optionnel permet de vérifier si options est défini avant d'essayer d'accéder à la propriété spaces. Si spaces est undefined, la fusion nullish lui attribue une valeur par défaut de 2, évitant ainsi des erreurs inattendues.
Il est important de noter que les opérateurs de fusion nullish et de chaînage optionnel sont des ajouts au standard ECMAScript, ce qui signifie qu'ils ne sont pas spécifiques à TypeScript et peuvent être utilisés dans JavaScript moderne également.
En plus de ces nouveaux outils, TypeScript a introduit des membres privés dans les classes à partir de la version 3.8. Ces membres privés, symbolisés par un # avant le nom du champ, permettent d'encapsuler les données de manière plus stricte qu'avec les modificateurs d'accès traditionnels comme private, protected et public. Un champ privé ne peut être accédé en dehors de la classe, même en temps d'exécution, ce qui assure une sécurité accrue dans la gestion des données sensibles au sein des classes.
Voici un exemple de classe utilisant des membres privés :
Cette classe encapsule le champ #name et expose une méthode publique pour y accéder, offrant ainsi une meilleure protection de l'état interne de l'objet. L'utilisation de membres privés dans les classes TypeScript permet de renforcer l'encapsulation et de garantir qu'il est impossible d'accéder directement aux données sensibles en dehors de la classe.
En résumé, l'introduction des opérateurs de fusion nullish et de chaînage optionnel, ainsi que des membres privés dans les classes, permet de rendre le code TypeScript plus sûr, plus lisible et plus résistant aux erreurs liées à la gestion des valeurs nulles ou indéfinies. Cependant, les développeurs doivent être vigilants face à la gestion des valeurs nulles et à l'usage des nouveaux outils pour éviter des comportements indésirables.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский