Séance 1 : TypeScript pour Vue 3 & Nuxt 4
🎯 Objectifs de la séance
Comprendre la valeur ajoutée de TypeScript dans un environnement de développement professionnel.
Maîtriser le typage statique : types primitifs, types complexes, interfaces, type aliases et génériques (
Generics).Éviter les pièges courants du typage :
anyvsunknown, assertion de type, type narrowing.Configurer et exploiter TypeScript en mode strict dans Vue 3 et Nuxt 4.
Typer rigoureusement les composants Vue 3 avec la Composition API (
defineProps,defineEmits,ref,computed).Atelier Fil rouge DevFlow : Modéliser le contrat de données initial du tracker de tâches
DevFlow.
📖 1. Pourquoi TypeScript dans un projet pro ?
JavaScript est un langage à typage dynamique : les erreurs de type ne sont détectées qu'à l'exécution (runtime), souvent directement entre les mains des utilisateurs finaux en production.
TypeScript apporte un typage statique optionnel et strict à JavaScript.
┌─────────────────────────────────────────────────────────────┐
│ Code TypeScript │
│ (Vérifié à la compilation / dans l'IDE) │
└──────────────────────────────┬──────────────────────────────┘
│ Compilation / Transpilation
▼
┌─────────────────────────────────────────────────────────────┐
│ Code JavaScript pur │
│ (Exécuté par le navigateur ou Node.js) │
└─────────────────────────────────────────────────────────────┘Les bénéfices majeurs en entreprise
Détection précoce des bugs : Erreurs de typage, accès à des propriétés inexistantes (
undefined is not a function), fautes de frappe détectées avant même d'exécuter l'application.Autocomplétion et Intellisense : L'éditeur de code (VS Code / Cursor / WebStorm) devient un copilote qui suggère les props, méthodes et types exacts.
Refactoring sécurisé : Renommer une propriété ou modifier une signature de fonction met en surbrillance tous les endroits du projet à adapter.
Auto-documentation vivante : Les types servent de contrat clair entre développeurs sans documentation obsolète.
🏗️ 2. Fondations du système de types
A. Types primitifs et littéraux
B. Tableaux et Tuples
C. Types personnalisés (type) vs Interfaces (interface)
Utilisez
interfacepour définir la structure d'objets extensibles et les contrats de données métier.Utilisez
type(Type Alias) pour les unions, tuples, primitives et types composés.
⚠️ 3. Gestion stricte : Bannir any, adopter unknown
Le type any désactive totalement le compilateur TypeScript. C'est l'équivalent d'abandonner toute sécurité.
Le piège de any
La sécurité avec unknown et le Type Narrowing
unknown indique qu'une valeur est inconnue à l'avance (ex: retour d'une API externe ou JSON.parse). TypeScript impose de vérifier le type avant de pouvoir manipuler la variable.
🧬 4. Les Génériques (Generics)
Les génériques permettent d'écrire des fonctions, des classes et des interfaces réutilisables qui fonctionnent avec n'importe quel type tout en conservant un typage strict.
Exemple : Wrapper de réponse API standardisé
⚙️ 5. Configuration stricte : tsconfig.json
Dans un projet Nuxt 4, le fichier tsconfig.json étend la configuration générée automatiquement par Nuxt (.nuxt/tsconfig.json).
Exigence d'évaluation : Lors des rendus et soutenances, l'option strict: true doit être activée sans générer d'erreurs de build (npx vue-tsc --noEmit).
🧩 6. TypeScript avec Vue 3 & Nuxt 4 (Composition API)
Dans Vue 3 avec <script setup lang="ts">, le typage est totalement intégré.
A. Typage des Props (defineProps)
B. Typage des Événements (defineEmits)
C. Typage des ref() et computed()
🛠️ 7. Atelier Pratique : Fil Rouge "DevFlow" (Étape 0)
Contexte de la mission DevSquad
En tant que nouvelle recrue chez DevSquad, vous devez concevoir la modélisation typée de DevFlow, notre tracker de tâches interne.
Exercice 1 : Modélisation des types métier
Dans votre projet, créez un fichier types/devflow.ts et déclarez les types suivants avec les contraintes associées :
TaskPriority: union de types littéraux'low' | 'medium' | 'high' | 'urgent'.TaskStatus: union de types littéraux'todo' | 'in_progress' | 'in_review' | 'done'.User: interface décrivant un utilisateur (id,name,email,avatar,roleparmi'lead' | 'frontend' | 'backend' | 'qa').Task: interface décrivant une tâche (id,title,description,status,priority,assigneenullable,tags,estimatedHours,createdAt,completedAtoptionnel).TaskFilterOptions: interface pour stocker l'état des filtres du dashboard (searchQuery,statusFilter,priorityFilter,assigneeId).
Exercice 2 : Composant typé UserAvatar.vue
Créez le composant components/UserAvatar.vue :
Props :
user: information partielle de l'utilisateur (nom, avatar, rôle) ounull.size:'sm' | 'md' | 'lg'avec'md'par défaut viawithDefaults.
Fonctionnement :
Si l'avatar (URL) est renseigné, afficher l'image.
Sinon, calculer et afficher les initiales de l'utilisateur en majuscules (ex: "Alexandre Dubois" $\rightarrow$ "AD").
Si
userestnull, afficher "?" avec un style neutre.
🎯 Auto-évaluation & Checklist
Avant de passer à la séance suivante, assurez-vous d'avoir validé :
Last updated