ProgrammationDéveloppeur Frontend

Décrivez les différences entre les types any, unknown et object dans TypeScript. Quand faut-il les utiliser ? Donnez des exemples de code.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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.

Exemple de code :

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 piège.

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(); } }

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


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.