Historique de la question :
TypeScript met en œuvre une typage statique, c'est pourquoi il est parfois nécessaire de convertir explicitement un type en un autre. Par exemple, quand le développeur connaît mieux la structure des données que le compilateur ou quand il doit interagir avec une API typée dont les types de sortie ne correspondent pas aux types attendus. Pour cela, on utilise le mécanisme de casting de types, ou d'assertion de types.
Problème :
Le casting de types (type casting) dans TypeScript ne réalise aucune conversion de valeurs au moment de l'exécution : il indique seulement au compilateur "fais-moi confiance". Cela peut entraîner des erreurs si le cast spécifié ne correspond pas au contenu réel des données. Les erreurs n'apparaîtront qu'à l'exécution, et le compilateur ne les détectera pas.
Solution :
TypeScript inclut deux syntaxes de conversion de types : la syntaxe avec des crochets angulaires (obsolète, à éviter pour JSX) et la syntaxe as (recommandée).
Exemple de code :
// Syntaxe via crochets angulaires (pas pour .tsx) let someValue: any = "Hello World"; let strLength: number = (<string>someValue).length; // Syntaxe via as let strLength2: number = (someValue as string).length; // Conversion de type d'objet (non sécurisé !) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // ça fonctionne, mais cela contourne la typage !
Caractéristiques clés :
Le type assertion effectue-t-il une conversion automatique de valeurs à l'exécution, comme en C# ou Java ?
Non, le type assertion indique seulement au compilateur que la variable est de ce type. Aucune conversion de valeurs ne se produit — la responsabilité incombe entièrement au développeur.
Peut-on convertir le type A en type B sans structure commune ?
TypeScript le permettra (via un double cast, par exemple any ou unknown), mais cela compromet la sécurité des types et peut entraîner des erreurs à l'exécution.
const a = 5 as unknown as string; // pas sécurisé !
Est-il sûr de convertir any en un type complexe ?
Non, any désactive le contrôle des types : la conversion de any en un autre type est possible, mais TypeScript ne pourra pas attraper les incohérences, toute erreur n'apparaîtra qu'à l'exécution.
Le développeur reçoit un objet du serveur sans vérifier la structure, le convertit au type attendu simplement avec as SomeType et l'utilise dans la logique métier. En cas de modification de l'API ou de bug sur le serveur, l'application plante à l'exécution, sans erreurs à l'étape de compilation.
Avantages :
Inconvénients :
Le développeur valide au préalable la structure de l'objet reçu, utilise une fonction de type guard personnalisée et seulement après une vérification réussie réalise un type assertion.
Avantages :
Inconvénients :