Inferred Type Predicates

TypeScript 🟡 Mid

Définition

Depuis TypeScript 5.5 (20 juin 2024), le compilateur infère lui-même le prédicat de type (x is T) d'une fonction dont le corps se réduit à une vérification de type sur son paramètre. Le cas emblématique : arr.filter(x => x !== undefined) renvoie désormais T[] et non (T | undefined)[], sans annotation manuelle.

Analogie

Le videur qui, en vous voyant sortir la carte d'identité, comprend tout seul ce qu'il vérifie.

Exemple de code

const valeurs: (number | undefined)[] = [1, undefined, 3];

// TS 5.5 : inféré comme (x) => x is number
const nombres = valeurs.filter(x => x !== undefined);
nombres.map(n => n.toFixed(1)); // n: number, plus d'erreur

// Fonction nommée : signature inférée `pet is Fish`
function estPoisson(p: Fish | Bird) {
  return 'swim' in p;
}

Cas d'usage

Filtrage de tableaux, nettoyage de valeurs nulles, découpage d'unions sans écrire de type guard explicite.

Anti-pattern

Continuer à écrire des prédicats manuels partout : ils masquent l'inférence et risquent d'être faux (le compilateur les croit).
#core#ts5.5#interview

En entretien

  1. Qu'est-ce que les inferred type predicates apportent depuis TypeScript 5.5 ?

    Le compilateur infère lui-même le prédicat de type (x is T) d'une fonction dont le corps se réduit à une vérification de type sur son paramètre. Le cas emblématique est arr.filter(x => x !== undefined), qui renvoie désormais T[] sans annotation manuelle.

  2. Pourquoi continuer à écrire des prédicats manuels partout est un anti-pattern maintenant ?

    Parce que ça masque l'inférence automatique du compilateur, et un prédicat manuel faux est cru aveuglément par TypeScript. Autant laisser le compilateur l'inférer quand c'est possible, c'est plus sûr.

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre