TypeScriptTypes de base

never

Le type d’une valeur qui ne se produit jamais : des fonctions qui ne se terminent pas normalement, et des cas impossibles.

Sur cette page

Exemple

#
TypeScript
type Shape = { kind: 'circle'; r: number } | { kind: 'square'; side: number }

function assertNever(value: never): never {
  throw new Error(`Cas non traité : ${JSON.stringify(value)}`)
}

function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.round(Math.PI * shape.r ** 2)
    case 'square':
      return shape.side ** 2
    default:
      return assertNever(shape)
  }
}

console.log(area({ kind: 'circle', r: 2 }))
console.log(area({ kind: 'square', side: 3 }))
Résultat
13
9

Définition et utilisation

#

Le type never décrit une situation qui ne peut pas se produire. Une fonction qui renvoie never ne se termine jamais par un retour normal : elle lève toujours une exception ou tourne dans une boucle infinie.

Son usage le plus pratique est la vérification d’exhaustivité. Si vous traitez toutes les variantes d’une union dans un switch, la valeur a le type never dans la branche default. Quand quelqu’un ajoute une nouvelle variante et oublie de la traiter, le compilateur signale une erreur.

never apparaît aussi de lui-même comme résultat d’une restriction de type, une fois que vous avez écarté tous les types possibles, ainsi que dans les types conditionnels comme façon de « supprimer » un membre d’une union.

Syntaxe

#
Syntaxe
function fail(message: string): never {
  throw new Error(message)
}

Bonnes pratiques

#
  • La fonction assertNever dans la branche default est un moyen simple de faire en sorte que le compilateur vous rappelle les nouvelles variantes.
  • N’utilisez pas never comme « type vide » pour des variables. On ne peut rien lui assigner.

Entrées associées

#

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