Types conditionnels
Des types choisis selon une condition : T extends U ? X : Y.
Exemple
#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
#type Result<T> = T extends Condition ? TypeIfTrue : TypeIfFalsePlus dâexemples
#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'))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
#- inferExtrait un type de lâintĂ©rieur dâun autre type, dans un type conditionnel.
- Exclude<UnionType, ExcludedMembers>Retire dâune union les types compatibles avec un type donnĂ©.
- Extract<Type, Union>Garde dans une union uniquement les types compatibles avec un type donné.
- neverLe type dâune valeur qui ne se produit jamais : des fonctions qui ne se terminent pas normalement, et des cas impossibles.
- Types mappĂ©sCrĂ©ent un nouveau type dâobjet en transformant chaque clĂ© dâun autre type.
Vous voyez une erreur ou il manque un exemple ? Ăcrivez-nous.