Comment résoudre le problème "Object is of type 'unknown" en TypeScript ?

Le langage TypeScript n'est pas un langage de programmation classique comme le C ou le PHP. Il s'agit d'une surcouche du langage JavaScript. Le code "TypeScript" est systématiquement transformé en JavaScript pour pouvoir être lu par les navigateurs. TypeScript possède comme principal avantage un typage statique, cela permet d'avoir un code plus sécurisé et plus simple à comprendre pour les développeurs. Chaque variable doit donc avoir un type pour être comprise par le compilateur. Le message d'erreur "Object is of type 'unknown'" est justement dû à un problème de type.

Ce message d'erreur s'affiche quand le compilateur n'arrive pas à détecter le type de la variable, il assigne alors le type "unknown". Ce type existe pour indiquer au développeur qu'il doit vérifier le type de la variable avant d'effectuer des instructions de code avec celle-ci. C'est un cas que l'on retrouve notamment dans les blocs "try… catch". Vous devez vérifier le type de la variable dans le bloc "catch" avant de la traiter.

try {
  // Traitement à contrôler
} catch (erreur) {
  // Il faut vérifier le type de l'erreur avant de l'afficher, sinon le message "Object is of type 'unknown'" s'affiche
  if (erreur instanceof Error) {
    console.log(erreur.message);
  }
}

Le message d'erreur peut également s'afficher si vous ne déclarez pas le type de l'argument dans une fonction, ni le type de la fonction elle-même, dans le cas d'une fonction de rappel (callback). Si plusieurs types sont possibles pour une même variable, vous pouvez utiliser le type "any". C'est ensuite à vous de faire les tests nécessaires dans votre code pour manipuler la variable.

// Erreur car le type de l'argument "options" n'est pas spécifié et la fonction n'est pas non plus typée
const makeFunction = <T>(callback: (someParam: number, options: T) => any)
// Bonne écriture (la fonction étend le type binaire, et "options" utilise le type "any" pour indiquer qu'elle peut avoir plusieurs types possibles
const makeFunction = <F extends (someParam: number, options: any) => any>(callback: F) => {

Si vous ne souhaitez pas gérer ce type d'erreur, il est possible d'indiquer au compilateur d'ignorer ces problèmes. Vous devez quand même faire attention, car cela peut provoquer des crashs dans votre application. Pour désactiver ces messages d'erreur, indiquez la variable "useUnknownInCatchVariables" dans le fichier de paramétrage "tsconfig.json".

"compilerOptions": {
    "useUnknownInCatchVariables": false
  }

JavaScript