Module Dart.3 – Types
Objectif
Maîtriser le typage fort de Dart et le null safety pour éviter les erreurs de null et créer du code robuste.
Théorie
Typage fort
Dart est un langage à typage statique avec inférence de type.
Types primitifs
int : Entiers
int age = 25;
int negatif = -10;
int hexa = 0xFF; // 255 en hexadécimal
int binaire = 0b1010; // 10 en binaire
double : Nombres décimaux
double prix = 19.99;
double scientifique = 1.5e3; // 1500.0
num : Type parent de int et double
num nombre = 42; // Peut être int ou double
nombre = 3.14; // OK : peut changer de type
String : Chaînes de caractères
String nom = 'Jean';
String message = "Bonjour";
String multiLigne = '''
Ligne 1
Ligne 2
''';
bool : Booléens
bool estActif = true;
bool estVide = false;
Inférence de type
Dart infère automatiquement le type.
var age = 25; // int
var prix = 19.99; // double
var nom = 'Jean'; // String
var actif = true; // bool
Type explicite vs inféré :
int age1 = 25; // Type explicite
var age2 = 25; // Type inféré (int)
// Les deux sont équivalents
Null safety
Depuis Dart 2.12, null safety est activé par défaut.
Principe
Par défaut, les variables ne peuvent pas être null.
String nom = 'Jean';
// nom = null; // Erreur : ne peut pas être null
Types nullable
Ajouter ? pour permettre null.
String? nomNullable = null; // Peut être null
String nom = 'Jean'; // Ne peut pas être null
nomNullable = 'Marie'; // OK
nomNullable = null; // OK
Vérification null
if null check :
String? nom = null;
if (nom != null) {
print(nom.length); // OK : Dart sait que nom n'est pas null
}
Null-aware operators :
?? (null coalescing) : Valeur par défaut si null
String? nom = null;
String resultat = nom ?? 'Inconnu'; // 'Inconnu'
??= (null-aware assignment) : Assigner seulement si null
String? nom;
nom ??= 'Par défaut'; // Assigné seulement si null
?. (null-aware access) : Accès sécurisé
String? nom = null;
int? longueur = nom?.length; // null (pas d'erreur)
String majuscules = nom?.toUpperCase() ?? 'Vide';
! (null assertion) : Forcer non-null (dangereux)
String? nom = obtenirNom();
String force = nom!; // Force non-null (crash si null)
Promotion de type
Dart promeut automatiquement les types nullable vers non-nullable après vérification.
String? nom = obtenirNom();
if (nom != null) {
// Ici, nom est promu en String (non-nullable)
print(nom.length); // Pas besoin de ?
}
Types dynamiques
dynamic : Désactive le typage statique (à éviter sauf cas spécifiques).
dynamic variable = 42;
variable = 'texte'; // OK : dynamic permet tout
variable = true; // OK
Object? : Type de base de tous les objets (peut être null).
Object? objet = 42;
objet = 'texte';
objet = null;
Vérification de types
is : Vérifie le type
var valeur = 42;
if (valeur is int) {
print('C\'est un int');
}
if (valeur is! String) {
print('Ce n\'est pas un String');
}
as : Cast de type
Object objet = 'texte';
String texte = objet as String; // Cast explicite
runtimeType : Type à l'exécution
var valeur = 42;
print(valeur.runtimeType); // int
Conversions de types
Vers String :
int age = 30;
String ageStr = age.toString();
String ageStr2 = '$age'; // Interpolation
Depuis String :
String nombre = '42';
int i = int.parse(nombre);
double d = double.parse('3.14');
Gestion d'erreurs :
String? nombre = '42';
int? i = int.tryParse(nombre ?? '0'); // null si échec
Exercice
-
Types primitifs
- Testez tous les types primitifs
- Comprenez les limites
- Testez les conversions
-
Null safety
- Créez des variables nullable
- Testez les null-aware operators
- Comprenez la promotion de type
-
Vérifications
- Utilisez is et as
- Testez runtimeType
- Vérifiez les types dynamiquement
-
Conversions
- Convertissez entre types
- Utilisez parse et tryParse
- Gèrez les erreurs
-
Cas pratiques
- Créez un système avec null safety
- Utilisez les opérateurs appropriés
- Évitez les erreurs de null
Quiz
-
Que signifie String? ?
- String obligatoire
- String ou null
- String avec valeur par défaut
-
Que fait l'opérateur ?? ?
- Compare deux valeurs
- Valeur par défaut si null
- Force non-null
-
Que fait ?. ?
- Accès normal
- Accès sécurisé (retourne null si null)
- Force l'accès
-
Que signifie is en Dart ?
- Conversion de type
- Vérification de type
- Assignation
-
Comment convertir String en int de manière sécurisée ?
- int.parse()
- int.tryParse() (retourne null si échec)
- (int) string
Mini défi
Mission : Créer un système de validation de types
Créez des fonctions qui valident et convertissent les types :
Fonctions :
- Validation (estNombre, estEntier, estChaine)
- Conversion sécurisée (versInt, versDouble avec défaut)
- Gestion null (valeurs nullable, opérateurs null-aware)
- Tests complets avec cas limites
Critères :
- ✅ Utilisation correcte du null safety
- ✅ Opérateurs null-aware appropriés
- ✅ Gestion d'erreurs complète
- ✅ Code robuste
Objectif : Maîtriser le typage fort et null safety pour créer du code robuste.
Validation : Vous pouvez passer au module suivant quand vous maîtrisez les types et null safety.