infer
Extrait un type de l’intérieur d’un autre type, dans un type conditionnel.
Exemple
#type ElementOf<T> = T extends (infer U)[] ? U : never
type Unwrap<T> = T extends Promise<infer U> ? U : T
type Tag = ElementOf<string[]>
// type Tag = string
type Data = Unwrap<Promise<{ level: number }>>
// type Data = { level: number }
type Plain = Unwrap<number>
// type Plain = number
const data: Data = { level: 7 }
console.log(data.level)7
Définition et utilisation
#Le mot-clé infer ne peut être utilisé que dans la condition d’un type conditionnel. Il déclare un nouveau paramètre de type local, que TypeScript fait correspondre lui-même. Par exemple, T extends Promise<infer U> ? U : T extrait le type de la valeur contenue dans une promesse.
C’est ainsi que fonctionnent les types utilitaires intégrés ReturnType, Parameters et Awaited. Vous pouvez créer les vôtres : le type d’un élément de tableau, le type de l’argument d’une fonction de rappel, le type d’un champ d’un objet imbriqué.
Si la correspondance échoue, le type conditionnel passe à la branche « sinon », donc il vaut toujours la peine de réfléchir à ce qu’elle doit renvoyer dans ce cas.
Syntaxe
#type Result<T> = T extends Pattern<infer U> ? U : OtherPlus d’exemples
#type FirstArg<F> = F extends (first: infer A, ...rest: any[]) => any ? A : never
function greet(name: string, times: number) {
return `Salut ${name}! `.repeat(times).trim()
}
type Name = FirstArg<typeof greet>
// type Name = string
const who: Name = 'Hugo'
console.log(greet(who, 2))Salut Hugo! Salut Hugo!
Bonnes pratiques
#- Avant d’écrire votre propre type avec
infer, vérifiez les types intégrés :ReturnType,Parameters,Awaited,InstanceType. - Nommez les paramètres
inferde façon descriptive quand le type devient complexe, par ex.infer TItem.
Entrées associées
#- Types conditionnelsDes types choisis selon une condition : T extends U ? X : Y.
- ReturnType<Type>Récupère le type de la valeur renvoyée par une fonction.
- Parameters<Type>Récupère les types des paramètres d’une fonction sous forme de tuple.
- Awaited<Type>Récupère le type de la valeur que produit un await sur une promesse.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.