Types conditionnels

Des types choisis selon une condition : T extends U ? X : Y.

Sur cette page

Exemple

#
TypeScript
type Label<T> = T extends string ? 'texte' : T extends number ? 'nombre' : 'autre chose'

type A = Label<'html'>
// type A = "texte"
type B = Label<42>
// type B = "nombre"
type C = Label<boolean>
// type C = "autre chose"

type OnlyStrings<T> = T extends string ? T : never
type Mixed = OnlyStrings<'a' | 1 | 'b' | true>
// type Mixed = "a" | "b"

Définition et utilisation

#

Un type conditionnel fonctionne comme l’opĂ©rateur ternaire, mais au niveau des types : T extends string ? "texte" : "autre". Si T est assignable Ă  string, le rĂ©sultat est le premier type, sinon le second.

Quand T est une union, la condition s’applique sĂ©parĂ©ment Ă  chacun de ses membres (on parle de distribution). Cela permet de filtrer facilement les types indĂ©sirables d’une union, en leur faisant renvoyer never. C’est ainsi que fonctionnent les types intĂ©grĂ©s Exclude et Extract.

Les types conditionnels sont le fondement de nombreux types utilitaires et bibliothÚques. Ils apparaissent plus rarement dans le code applicatif, mais il vaut la peine de les comprendre pour pouvoir lire des définitions de types.

Syntaxe

#
Syntaxe
type Result<T> = T extends Condition ? TypeIfTrue : TypeIfFalse

Plus d’exemples

#
Un type qui dĂ©pend d’un argument
TypeScript
function parse<T extends 'number' | 'boolean'>(value: string, as: T): T extends 'number' ? number : boolean {
  return (as === 'number' ? Number(value) : value === 'true') as T extends 'number' ? number : boolean
}

console.log(parse('42', 'number') + 1)
console.log(parse('true', 'boolean'))
Résultat
43
true

Bonnes pratiques

#
  • Si un type conditionnel devient long, dĂ©coupez-le en plusieurs types auxiliaires nommĂ©s.
  • La distribution sur une union peut ĂȘtre dĂ©sactivĂ©e en entourant le type de crochets : [T] extends [string].

Entrées associées

#

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