NoInfer<Type>

Bloque l’inférence d’un paramètre de type à partir d’un endroit donné, pour que d’autres arguments déterminent le type.

Sur cette page

Exemple

#
TypeScript
function createSelect<T extends string>(options: T[], initial: NoInfer<T>) {
  return { options, selected: initial }
}

const difficulty = createSelect(['easy', 'medium', 'hard'], 'medium')
// T = "easy" | "medium" | "hard", inféré seulement à partir de options
console.log(difficulty.selected)

createSelect(['easy', 'medium', 'hard'], 'expert')
// Erreur : Argument of type '"expert"' is not assignable to parameter of type '"easy" | "medium" | "hard"'.
Résultat
medium

Définition et utilisation

#

NoInfer<Type> marque une position à partir de laquelle le compilateur ne doit pas inférer le paramètre de type. Le type lui-même ne change pas : NoInfer<string> reste string. Ce qui change, c’est seulement l’endroit d’où TypeScript tire ses informations quand il détermine T lors de l’appel d’une fonction générique.

Une situation typique est une fonction avec une liste de valeurs autorisées et une valeur initiale. Si les deux paramètres ont le type T, le compilateur infère T à partir des deux arguments, donc une faute de frappe dans la valeur initiale élargit silencieusement l’union, au lieu de signaler une erreur. Avec NoInfer<T> sur la valeur initiale, le type vient uniquement de la liste.

Ce type est disponible depuis TypeScript 5.4. Dans les versions plus anciennes, le même effet s’obtient avec un second paramètre de type contraint, par ex. <T extends string, D extends T>.

Syntaxe

#
Syntaxe
function name<T>(source: T[], other: NoInfer<T>) { … }

Paramètres de type

#
  • Type

    type quelconque

    Le type qui reste inchangé, mais qui ne participe pas à l’inférence.

Plus d’exemples

#
Sans NoInfer, une faute de frappe passe
TypeScript
function createSelectLoose<T extends string>(options: T[], initial: T) {
  return { options, selected: initial }
}

const loose = createSelectLoose(['easy', 'medium', 'hard'], 'expert')
// T = "easy" | "medium" | "hard" | "expert", pas d’erreur
console.log(loose.selected)
Résultat
expert
La méthode d’avant TypeScript 5.4
TypeScript
function createSelectOld<T extends string, D extends T>(options: T[], initial: D) {
  return { options, selected: initial }
}

createSelectOld(['easy', 'medium', 'hard'], 'expert')
// Erreur : Argument of type '"expert"' is not assignable to parameter of type '"easy" | "medium" | "hard"'.

Bonnes pratiques

#
  • Utilisez NoInfer quand un argument doit déterminer le type, et que les autres doivent seulement être comparés à lui, par ex. une valeur initiale avec une liste d’options.
  • Dans la plupart des fonctions génériques, NoInfer n’est pas nécessaire. Ajoutez-le seulement quand l’inférence à partir d’un des arguments donne un type trop large.

Entrées associées

#

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