ComparaisonComparaisons

any vs unknown

any désactive la vérification des types et autorise tout, tandis que unknown accepte aussi toute valeur, mais exige une vérification de type avant de l’utiliser.

Sur cette page

Comparaison point par point

#
  • Accepte n’importe quelle valeur

    any
    Oui
  • Utilisation sans vérification de type

    any
    Oui, le compilateur ne proteste pas
    unknown
    Non, il faut d’abord restreindre le type
  • Appel d’une méthode quelconque

    any
    Autorisé, même avec un nom erroné
    unknown
    Erreur : Object is of type 'unknown'
  • Affectation à un autre type sans vérification

    any
    Autorisée
    unknown
    Bloquée
  • Où l’erreur apparaît

    any
    Seulement à l’exécution
    unknown
    Déjà à la compilation
  • Usage typique

    any
    Migration depuis JavaScript, bibliothèques sans types
    unknown
    Données d’API, JSON.parse(), catch (error)

Exemple

#
TypeScript
function describeAny(value: any): string {
  return value.toUpperCase()
}

function describeUnknown(value: unknown): string {
  if (typeof value === 'string') return value.toUpperCase()
  return 'type inconnu'
}

console.log(describeAny('html'))
console.log(describeUnknown('css'))
console.log(describeUnknown(42))
Résultat
HTML
CSS
type inconnu

Définition et utilisation

#

Les deux types acceptent une valeur de n’importe quel type : vous pouvez assigner à une variable any ou unknown une chaîne, un nombre, un objet ou le résultat de JSON.parse(). Dans les deux cas, le compilateur ne sait pas d’avance ce qu’est vraiment cette valeur.

La différence porte sur ce que vous pouvez faire ensuite. Sur une valeur any, vous pouvez appeler immédiatement n’importe quelle méthode et la transmettre partout, sans aucune vérification, car le compilateur arrête de surveiller les types. Sur une valeur unknown, vous ne pouvez rien faire avant d’avoir restreint le type avec typeof, instanceof, Array.isArray() ou votre propre garde de type. C’est seulement après une telle vérification que le compilateur donne accès aux méthodes propres au type reconnu.

any est une porte dérobée qui désactive TypeScript là où vous l’utilisez, et il est facile de laisser passer une erreur jusqu’au programme en cours d’exécution. unknown offre la même flexibilité pour accueillir des données, mais force à les vérifier, donc pour des données externes (API, JSON.parse(), localStorage), choisissez unknown. Gardez any comme solution temporaire lors d’une migration depuis JavaScript.

Syntaxe

#
Syntaxe
let value: any
let other: unknown

Plus d’exemples

#
any ne protège pas contre une erreur à l’exécution
TypeScript
const broken: any = { user: null }

try {
  console.log(broken.user.name)
} catch (error) {
  console.log('Erreur à l’exécution, le compilateur n’a rien signalé')
}
Résultat
Erreur à l’exécution, le compilateur n’a rien signalé
unknown bloque l’utilisation sans vérification
TypeScript
const input: unknown = JSON.parse('{"level":7}')
console.log(input.level)
// Erreur : 'input' is of type 'unknown'.

Bonnes pratiques

#
  • Activez l’option noImplicitAny, pour que le compilateur n’accepte pas silencieusement any là où vous n’avez pas donné de type.
  • L’erreur dans catch (error) a le type unknown. Vérifiez error instanceof Error avant de lire error.message.
  • Si vous migrez du code de any vers unknown, le compilateur signale lui-même chaque endroit qui nécessite une vérification de type.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.