Génériques <T>

Types et fonctions avec un paramètre de type, qui fonctionnent pour plusieurs types sans perdre en précision.

Sur cette page

Exemple

#
TypeScript
function first<T>(items: T[]): T | undefined {
  return items[0]
}

const name = first(['Léa', 'Lucas'])
// const name: string | undefined
const course = first([{ title: 'HTML', modules: 11 }])
// const course: { title: string; modules: number } | undefined

console.log(name?.toUpperCase())
console.log(course?.modules)
Résultat
LÉA
11

Définition et utilisation

#

Un générique est un type avec un paramètre, noté entre chevrons : <T>. Il permet d’écrire une fonction, une classe ou un type une seule fois, et de l’utiliser avec différents types de données, tout en conservant l’information de type complète.

Sans générique, une fonction qui renvoie le premier élément d’un tableau devrait renvoyer any ou unknown. Avec le générique function first<T>(items: T[]): T | undefined, le compilateur sait que pour un tableau de chaînes, le résultat est une chaîne, et pour un tableau de cours, un objet cours.

Le plus souvent, le paramètre de type est déduit des arguments, donc vous n’avez pas besoin de le préciser. Vous l’écrivez explicitement quand il ne peut pas être déduit, par exemple useState<string | null>(null).

Syntaxe

#
Syntaxe
function name<T>(param: T): T { … }
type Box<T> = { value: T }

Plus d’exemples

#
Un type de réponse API générique
TypeScript
type ApiResponse<T> = { ok: true; data: T } | { ok: false; error: string }

function unwrap<T>(response: ApiResponse<T>, fallback: T): T {
  return response.ok ? response.data : fallback
}

const levels: ApiResponse<number[]> = { ok: true, data: [1, 2, 3] }
const failed: ApiResponse<number[]> = { ok: false, error: 'timeout' }

console.log(unwrap(levels, []))
console.log(unwrap(failed, []))
Résultat
[1, 2, 3]
[]

Bonnes pratiques

#
  • Les noms des paramètres de type peuvent être descriptifs, par ex. <TItem>, quand il y en a plusieurs. Un simple T convient pour des fonctions simples.
  • Si un paramètre de type n’apparaît qu’une seule fois dans la signature, il n’est probablement pas nécessaire.

Entrées associées

#

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