🎁 Inscrivez-vous et profitez gratuitement de 30 minutes maximum d’IA en ligne. Aucune carte bancaire requise.

Questions et réponses d'entretien TypeScript (2026) : Types, génériques et narrowing

October 9, 2026
20 questions d'entretien TypeScript avec réponses, testées en mode strict : type vs interface, any vs unknown, unions, génériques, types utilitaires et typage structurel.
Questions et réponses d'entretien TypeScript (2026) : Types, génériques et narrowing
questions d'entretien typescript
entretien typescript
type vs interface
any vs unknown typescript
entretien génériques typescript

Les entretiens TypeScript évaluent si vous comprenez le système de types, au-delà de la syntaxe. Voici 20 questions avec réponses, des bases à celles qui séparent ceux qui utilisent TypeScript de ceux qui savent pourquoi ça fonctionne. Le code a été compilé avec le compilateur TypeScript en mode strict avant publication, et les messages d'erreur cités sont les vrais.

Les bases

1. Qu'apporte TypeScript à JavaScript ?

Un système de types statique vérifié à la compilation puis effacé. La sortie est du JavaScript pur, donc les types n'ont ni coût ni présence à l'exécution. Ce dernier point compte : vous ne pouvez pas vérifier un type avec typeof à l'exécution, sauf si vous écrivez la vérification vous-même.

2. Quelle est la différence entre type et interface ?

Les deux décrivent des formes d'objets et sont souvent interchangeables. Les différences pratiques :

interfacetype
Fusion de déclarationsOui, deux déclarations fusionnentNon, un nom en double est une erreur
Unions et primitifsNe peut pas les exprimerPeut les exprimer, comme une union de number et string
ExtensionextendsIntersection avec &
Types mappés et conditionnelsNonOui

Déclarer interface A deux fois fusionne les champs. Déclarer type B deux fois produit error TS2300: Duplicate identifier 'B'. Une règle courante : utilisez interface pour les formes d'objets publiques que d'autres peuvent étendre, et type pour tout le reste.

3. Quelle est la différence entre any, unknown et never ?

  • any désactive la vérification. Tout passe, et les erreurs se cachent.
  • unknown est la version sûre. Vous pouvez lui assigner n'importe quoi, mais vous devez le réduire avant utilisation. Appeler x.toFixed() sur un unknown échoue avec error TS18046: 'x' is of type 'unknown'.
  • never est le type des valeurs qui ne peuvent pas exister, comme une fonction qui lance toujours une exception. C'est utile pour les vérifications exhaustives.

Préférez unknown à any pour les valeurs dont vous ne contrôlez pas le type, comme du JSON parsé.

4. Que fait le mode strict ?

Il active un groupe de vérifications, notamment strictNullChecks (donc null et undefined sont des types distincts) et noImplicitAny. Avec lui, utiliser une valeur optionnelle sans vérification donne error TS18048: 'x' is possibly 'undefined'. Les nouveaux projets devraient démarrer avec strict activé.

5. Quelle est la différence entre readonly et const ?

const empêche la réassignation d'une variable. readonly empêche l'assignation d'une propriété. Écrire dans une propriété readonly donne error TS2540: Cannot assign to 'n' because it is a read-only property. Ni l'un ni l'autre ne rend l'objet sous-jacent profondément immuable.

Les types en pratique

6. Que sont les types union et comment les réduire ?

Une union signifie « l'un de ces types ». La réduction utilise des vérifications que le compilateur comprend :

type Id = number | string;
function describe(id: Id): string {
  if (typeof id === "string") return id.toUpperCase();
  return id.toFixed(1);
}

Dans le if, id est un string. Après, le compilateur sait que c'est un number. Les autres outils de réduction sont instanceof, l'opérateur in, les comparaisons d'égalité et les gardes de type personnalisées.

7. Qu'est-ce qu'une union discriminée ?

Une union où chaque membre possède un champ littéral commun, le discriminant, qui les distingue :

type Shape =
  | { kind: "circle"; r: number }
  | { kind: "sq"; s: number };

function assertNever(x: never): never {
  throw new Error("unexpected " + x);
}

function area(s: Shape): number {
  switch (s.kind) {
    case "circle": return Math.PI * s.r ** 2;
    case "sq": return s.s ** 2;
    default: return assertNever(s);
  }
}

Si vous ajoutez plus tard une nouvelle forme et oubliez un case, la branche default cesse de compiler, car s n'est plus never. C'est une vérification exhaustive.

8. Que sont les génériques, et pourquoi les utiliser ?

Ils permettent à une fonction ou un type de fonctionner sur de nombreux types tout en préservant la relation entre eux :

function first<T>(xs: T[]): T | undefined { return xs[0]; }
function pick<T, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }

first([1, 2]) renvoie number | undefined, pas any. pick(user, "name") renvoie le type de name. La contrainte extends keyof T vous empêche de passer une clé qui n'existe pas.

9. Quels sont les types utilitaires courants ?

UtilitaireCe qu'il fait
Partial<T>Rend chaque propriété optionnelle
Required<T>Rend chaque propriété obligatoire
Readonly<T>Rend chaque propriété readonly
Pick<T, K>Ne garde que les clés listées
Omit<T, K>Supprime les clés listées
Record<K, V>Un type d'objet avec les clés K et les valeurs V
ReturnType<F>Le type de retour d'un type de fonction

10. Que sont les types mappés ?

Ils construisent un nouveau type en parcourant les clés d'un autre. Partial lui-même s'écrit { [K in keyof T]?: T[K] }. Le savoir montre que vous comprenez les types utilitaires au lieu de les mémoriser.

11. Qu'est-ce que as const ?

Cela indique au compilateur d'inférer le type le plus étroit et de tout marquer readonly. const arr = [1, 2, 3] as const a le type readonly [1, 2, 3], et arr.push(4) échoue avec error TS2339: Property 'push' does not exist on type 'readonly [1, 2, 3]'. C'est utile pour les listes de valeurs autorisées et les objets de configuration.

12. Qu'est-ce qu'une assertion de type, et quand est-elle dangereuse ?

value as Type dit au compilateur de vous faire confiance. Cela n'effectue aucune vérification à l'exécution. Si vous vous trompez, l'erreur se manifeste plus tard sous forme de crash. Préférez la réduction avec une vérification, ou une fonction de garde de type, à l'assertion.

Comportement du langage

13. Quelle est la différence entre null et undefined ?

undefined signifie qu'une valeur n'a jamais été assignée, tandis que null signifie qu'on a volontairement défini « aucune valeur ». Avec strictNullChecks, ce sont deux types distincts. Utilisez le chaînage optionnel (a?.b) et la coalescence nulle (a ?? b) pour les gérer. Contrairement à ||, ?? ne se rabat que sur null et undefined, donc 0 et la chaîne vide sont conservés.

14. Qu'est-ce que l'assertion non-nulle ! ?

value! indique au compilateur qu'une valeur n'est ni null ni undefined. Comme as, elle n'est pas vérifiée. C'est acceptable dans quelques cas où vous en savez plus que le compilateur, mais une vérification à l'exécution est généralement plus sûre.

15. Que fait keyof, et qu'est-ce que typeof en position de type ?

keyof T produit l'union des noms de propriétés de T. En position de type, typeof x récupère le type d'une valeur, ce qui évite de le répéter. Ensemble, keyof typeof obj donne les clés d'un objet que vous avez défini comme valeur.

16. Comment les enums se comparent-ils aux types union ?

Les enums créent un objet et des valeurs à l'exécution. Une union de littéraux de chaîne, comme "idle" | "loading", est effacée à la compilation et ne nécessite aucun code supplémentaire. Beaucoup d'équipes préfèrent les unions de littéraux de chaîne pour leur simplicité et utilisent les enums quand elles ont besoin de l'objet à l'exécution.

Outillage et projets réels

17. À quoi sert tsconfig.json, et quelles options sont importantes ?

Il indique au compilateur quels fichiers inclure et comment les vérifier. Les options sur lesquelles les recruteurs interrogent : strict, target (la version de JavaScript à générer), module et moduleResolution, noEmit (vérification seule, courante quand un autre outil se charge du build), esModuleInterop et skipLibCheck.

18. Comment typer quelque chose qui vient de l'extérieur, comme une réponse d'API ?

Les types disparaissent à l'exécution, donc le compilateur ne peut pas vérifier ce que renvoie le réseau. Traitez les données comme unknown, puis validez-les avec une bibliothèque de schémas ou un type guard écrit à la main avant de les utiliser. Asserter un type sur du JSON parsé masque les bugs.

19. Comment migrer un projet JavaScript vers TypeScript ?

Procédez progressivement. Ajoutez un tsconfig.json avec allowJs, renommez les fichiers un par un, activez les options plus strictes au fil du temps, et ajoutez des types d'abord aux frontières, comme les clients d'API et les utilitaires partagés. Évitez une réécriture totale d'un coup.

20. Qu'est-ce que le typage structurel ?

TypeScript compare les types par leur forme, pas par leur nom. Si un objet possède les champs qu'un type exige, il est accepté, même s'il n'a jamais été déclaré comme ce type. C'est différent des langages à typage nominal, où le nom déclaré compte.

Comment se préparer

  1. Ouvrez un playground ou un petit projet en mode strict et testez chaque exemple ci-dessus, y compris ceux qui sont censés échouer.
  2. Soyez prêt à écrire une fonction générique et une union discriminée de mémoire.
  3. Sachez pourquoi vous choisiriez unknown plutôt que any.
  4. Préparez une anecdote sur le typage d'un cas délicat dans un vrai projet.

Pour vous entraîner sur des sujets connexes, consultez nos guides sur les questions d'entretien Node.js, les questions d'entretien Angular et les questions d'entretien Python.

Entraînez-vous à voix haute et avec vos propres mots. Une transcription par la suite montre où vous avez divagué ou raté l'essentiel. Respectez les règles de l'employeur concernant les outils d'IA lors de tout entretien ou test en direct.

Entraînez vos réponses avec YesToTheOffer

Répétez à voix haute, obtenez des réponses construites à partir de votre propre CV et consultez votre transcription ensuite. 30 minutes gratuites, sans abonnement.

iOS & Android — Bientôt disponible
Voir les tarifs