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.
Exemple
#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"'.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
#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
#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)expert
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
NoInferquand 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,
NoInfern’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
#- Génériques <T>Types et fonctions avec un paramètre de type, qui fonctionnent pour plusieurs types sans perdre en précision.
- Contraintes génériques (extends)Exiger qu’un paramètre de type respecte une forme précise.
- Inférence de typeLe compilateur détermine automatiquement les types sans que vous écriviez d’annotations.
- Types littérauxDes types qui n’autorisent que des valeurs précises, par ex. "easy" | "hard".
- Paramètres de type par défautLa valeur que prend un paramètre de type quand il n’est ni fourni ni déduit.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.