infer

Extrait un type de l’intérieur d’un autre type, dans un type conditionnel.

Sur cette page

Exemple

#
TypeScript
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)
Résultat
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

#
Syntaxe
type Result<T> = T extends Pattern<infer U> ? U : Other

Plus d’exemples

#
Le type du premier argument d’une fonction
TypeScript
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))
Résultat
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 infer de façon descriptive quand le type devient complexe, par ex. infer TItem.

Entrées associées

#

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