Dans TypeScript, les types any, unknown et object sont utilisés pour différents scénarios et ont des différences clés :
any : désactive le système de typage pour la variable. Permet de faire quoi que ce soit avec la variable, sans provoquer d'erreurs de compilation. Utilisez-le lorsque le type de l'objet est inconnu à l'avance et que la sécurité n'est pas critique.unknown : accepte également n'importe quel type, mais nécessite une vérification explicite/conversion du type pour travailler avec de telles variables. Plus sûr que any. Utilisez-le pour des valeurs de type inconnu afin de ne pas perdre le contrôle sur le typage.object : type uniquement pour les objets non primitifs (objets, tableaux, fonctions), mais pas pour les primitifs (nombres, chaînes de caractères). Limite le travail aux objets uniquement.let a: any = 1; a = 'chaîne'; // OK a(); // OK (mais peut entraîner une erreur à l'exécution) let b: unknown = 'bonjour'; b = 5; // OK // b.toUpperCase(); // Erreur — nécessite une vérification de type if (typeof b === 'string') { console.log(b.toUpperCase()); } let c: object = { key: 'valeur' }; c = [1, 2, 3]; // OK // c = 1; // Erreur, car '1' n'est pas un objet
Question : Quelle est l'utilité du type unknown si nous pouvons utiliser any ?
Réponse : unknown augmente la sécurité du code — vous ne pouvez pas effectuer d'actions non vérifiées sur la variable comme avec any. Il est nécessaire de vérifier ou de convertir explicitement le type, ce qui exclut de nombreuses surprises à l'exécution.
function handle(value: unknown) { // value.trim(); // Erreur if (typeof value === 'string') { value.trim(); } }
Histoire
Dans un projet, ils ont décidé d'intégrer rapidement une bibliothèque tierce, décrivant son résultat par any, afin de ne pas se soucier des types. En conséquence, à l'exécution, ils ont découvert que la bibliothèque renvoyait un objet avec des champs au lieu d'un tableau, ce qui a provoqué massivement des erreurs pour la méthode .map() — ce code compilait, mais échouait à l'exécution.
Histoire
Un des développeurs a utilisé unknown pour les données provenant du backend, mais n'a pas ajouté de vérification de type avant de travailler avec les champs. En conséquence, TypeScript n'a pas compilé le code — et il a dû rapidement le changer en any, ce qui a caché des erreurs potentielles de parsing et a conduit à des bugs en production en raison d'un format de données incorrect.
Histoire
Lors de l'utilisation du type object, une confusion est survenue : ils ont essayé d'assigner à une variable de type object des valeurs string et number. Bien qu'il n'y ait pas eu de soupçons au stade de développement, des erreurs ont été révélées lors de la révision, car les méthodes de l'objet ne fonctionnaient pas avec les primitifs. Cela a nécessité un temps supplémentaire pour résoudre le problème.