Exercice 04 - Utilisation de TypeScript
Table des matières
Mise en situation
Vous avez compris le pourquoi et la raison d'être de TypeScript, maintenant il est temps de le mettre en pratique avec un exercice pratique!
Modalités
- Exercice seul
- Réaliser durant le cours
- Durée approximative le reste du cours
- Remettre le tout sur Léa dans Exercice 04 pour le prochain cours!
- IMPORTANT: Supprimer le dossier node_modules
À faire (étapes)
Pour débuter l'exercice:
- Effacer le dossier node__modules et dist du dossier de l'atelier 04(atel04)
- Faite une copie du dossier atel04 et renommez-le exer04
Dans le terminal, on installe les dépendances et on lance le serveur:
npm install
npm run dev
En utilisant le code de l'exercice 02, vous avez trois tâches
- Amélioration du code existant
- Intégration du code existant dans un projet TypeScript
- Conversion du code JavaScript en code TypeScript
Amélioration du code existant
Vous pouvez bien sûr prendre votre code de votre exercice pour améliorer celui-ci, l'idée est de faire de l'amélioration de l'existant!
Voici quelques suggestions pour améliorer le code existant :
- Utiliser des fonctions d'utilité pour la validation des champs : On a créé des fonctions
validateTextField
etvalidateNumField
pour valider les champs de texte et numériques respectivement. On pourrait créer des fonctions de validations plus générales pour la validation des champs multiples et celle des points de caractéristiques. - Utiliser des constantes pour les messages d'erreur réutilisables : plutôt que de définir les messages d'erreur directement dans les fonctions de validation, on pourrait les stocker dans des constantes en haut du fichier. Cela permettrait de centraliser la gestion des messages d'erreur et faciliterait leur modification ultérieure si nécessaire.
- Utiliser une approche plus générique pour la validation des champs de compétences : au lieu de valider spécifiquement le champ de compétences dans une fonction distincte, on pourrait généraliser l'approche de validation utilisée pour les autres champs. Cela pourrait rendre le code plus cohérent et plus facile à maintenir.
- Améliorer la lisibilité du code : on pourrait améliorer la lisibilité du code en ajoutant des commentaires explicatifs là où cela est nécessaire, en particulier pour expliquer le but et le fonctionnement des différentes parties du code.
- Optimiser la logique de validation des points de caractéristiques : la fonction
validateCharacterPoints
peut être optimisée pour éviter la répétition du message d'erreur lorsque le total des points dépasse 27. Une fois que le total des points dépasse 27, on pourrait simplement retournerfalse
sans itérer sur tous les champs à nouveau. - Utiliser des noms de variables plus explicites : les noms de variables comme
PLAYER
,CHARACTER
,BACKGROUND
, etc., pourraient être plus descriptifs pour améliorer la compréhension du code.
Pour l'exercice, vous devez améliorer au moins 4 éléments distincts, selon votre avis personnel.
Intégration du code existant dans un projet TypeScript
- Le code JavaScript de app.js de l'exercice 02 doit être transféré en bas dans index.ts de l'exercice 04
- Supprimer le code JavaScript superflu du fichier index.ts de l'exercice 04:
setupCounter(document.querySelector('#counter')!) - Le code HTML de l'entête et du footer du fichier index.html de l'exercice 02 doit être transféré dans index.html de l'exercice 04
- Vous pouvez entourer la div#app par une balise main du fichier index.html de l'exercice 04
- Mettez à jour le title de votre site dans index.html de l'exercice 04 pour: Guide du joueur - Créer son perso | Dongeons & Dragons 5ième édition
- Le CSS de l'exercice 02 doit être transférer et remplacer celui présent dans style.css de l'exercice 04
- Penser à l'endroit ou mettre le code HTML du formulaire (indice: index.ts) c'est ce html qui sera injecté dans la div#app!
document.querySelector('#app')!.innerHTML = `` - Intégrer l'image de l'exercice 02 et faire le ménage des images superflues de l'exercice 04
Exemple:<img class="img-fluid d-none d-lg-block" src="/src/assets/personnage.jpg" alt="Bannière qui affiche différents personnage de DnD">
Le code compilé ressemblera à ça
<img class="img-fluid d-none d-lg-block" src="/assets/personnage-kRMnL-B2.jpg" alt="Bannière qui affiche différents personnage de DnD">
- Intégrer le JavaScript de Bootstrap ainsi que le fichier CSS de Bootstrap.
- Il y a deux méthodes pour le faire!
Exemple possible:import '../css/style.css' import '../css/bootstrap.min.css' import '../js/bootstrap.bundle.min.js'
- Il y a deux méthodes pour le faire!
- Votre projet devrait fonctionner à partir de ce moment! (npm run dev)
- À noter: votre fichier index.ts va contenir des erreurs MAIS tout devrais s'afficher dans le navigateur!
Conversion du code JavaScript en code TypeScript
Maintenant le cœur de l'exercice! Vous devez convertir le code JavaScript pour répondre au maximum aux normes de TypeScript!
- Les constantes d'éléments HTML doivent être typées! (HTMLElement)
- HTMLInputElement, HTMLFormElement, HTMLElement, etc.
- Pour trouver le bon type allez voir la documentation HTML en bas de chaque page il y a le type au niveau du DOM
- Exemple:
const CHARACTER_CREATION: HTMLFormElement | null = document.getElementById('creationPersonnage') as HTMLFormElement
- Les fonctions devront avoir des retours typés
- Les fonctions devront avoir des paramètres typés
- Vous aurez parfois des erreurs à cause que la variable ne peut être null, pour corriger cela mettez des points d'exclamation:
errorCount += validateTextField(CHARACTER!, ERR_CHARACTER!)
- Vous aurez parfois des erreurs à cause que la variable ne peut être null, pour corriger cela mettez des points d'exclamation:
- Les variables devront être typées (OBLIGATOIRE pour la compréhension)
- Les tableaux doivent aussi être typés!
- EXPERT: Trouvez le moyen de séparer les définitions de constantes d'éléments HTML, de messages d'erreurs, etc., dans un ou des fichiers séparés!
- Regardez comment est intégré counter.ts! (import { setupCounter } from './counter.ts')
- Aller lire la documentation sur les modules
- FINALEMENT, faites un npm run build pour voir si votre projet se construit bien!
Quelques conseils
-
Commencez petit
- Intégrez progressivement : Commencez par convertir de petits fichiers ou modules pour vous familiariser avec TypeScript.
- Utilisez
allowJs
: activez l'optionallowJs
dans votre fichiertsconfig.json
pour permettre à TypeScript de compiler les fichiers JavaScript, facilitant ainsi la migration fichier par fichier.
-
Apprenez les bases de TypeScript
- Types de base : Familiarisez-vous avec les types primitifs (
string
,number
,boolean
, etc.). - Types avancés : Apprenez à utiliser les interfaces, les enums, les tuples, et les unions/intersections de types.
- Types de base : Familiarisez-vous avec les types primitifs (
-
Annoter avec des types explicites
- Variables et fonctions : Ajoutez des annotations de type aux variables et aux signatures de fonction pour améliorer la vérification des types.
- Paramètres et retours de fonction : Spécifiez les types pour tous les paramètres et retours de fonction.
-
Utilisez
any
avec prudence- Évitez
any
: L'utilisation deany
réduit la sécurité de type offerte par TypeScript. - Refactorisez les
any
: Remplacez progressivementany
par des types plus précis lors de la révision de votre code.
- Évitez
-
Gestion des modules
- Modules ES6 : Assurez-vous d'utiliser
import
etexport
pour la gestion des modules. - Déclarations de types pour bibliothèques tierces : Installez les paquets de déclarations de type pour les bibliothèques JavaScript tierces via DefinitelyTyped.
- Modules ES6 : Assurez-vous d'utiliser
-
Profitez des outils et de la communauté
- Outils de linting et de formatage : Utilisez ESLint avec des plugins TypeScript et Prettier.
- Ressources : La documentation officielle de TypeScript, les forums, les blogues, et les tutoriels vidéo sont d'excellentes ressources.
-
Revoyez votre architecture
- Patterns de conception : Réévaluez l'utilisation des patterns dans votre application avec les capacités de TypeScript.
Remise finale
- Remettre le tout sur Léa dans Exercice 04 pour le prochain cours!
- IMPORTANT: Supprimer le dossier node_modules