ProgrammationDéveloppeur Fullstack

Parlez des interfaces (interface) et des types (type alias) en TypeScript. Quelle est la différence entre eux, et quand choisir l'un ou l'autre ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Les deux mécanismes — interface et type alias — permettent de décrire des structures de données (objets, fonctions, types complexes).

  • Interface — déclaration classique d'interface. Permet d'étendre des interfaces, de fusionner (declaration merging), et d'hériter facilement.
  • Type alias — crée un nouvel alias de type. Peut être combiné à l'aide d'union / intersection, attribué à n'importe quelle entité : primitives, fonctions, tuples, etc.

Différences :

  • Extensibilité : l'interface est meilleure pour les structures d'objet, elle prend en charge la fusion déclarative.
  • Flexibilité : le type alias est polyvalent, adapté à tout : unions (|) et intersections (&).

Exemple :

interface Animal { name: string } interface Dog extends Animal { bark(): void } // type alias pour l'union de types : type MyType = string | number type Cat = Animal & { purr(): void }

Recommandations :

  • Pour les API publiques — utiliser interface.
  • Pour des unions complexes et des alias — utiliser type.

Question piège.

Question : Peut-on ajouter un nouveau champ à un type défini par un type alias dans un autre fichier ?

Réponse :

Non. Le type alias ne peut pas être étendu déclarativement depuis un autre fichier, contrairement à l'interface.

Exemple :

// main.ts type User = { name: string } // another.ts type User = { age: number } // Erreur : Duplicate identifier // interface : // main.ts interface User { name: string } // another.ts interface User { age: number } // Ok, User = { name: string, age: number }

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un grand projet, des structures de données communes ont été définies via type alias. Lorsque nous avons eu besoin d'ajouter un champ à un type existant d'un autre paquet, il s'est avéré que le type alias ne prend pas en charge la fusion déclarative — il a fallu le réécrire en interface, ce qui a causé des retards.


Histoire

Un des développeurs a décrit des fonctions via interface, puis a tenté d'ajouter un type union (chaîne ou fonction) — il s'est avéré que l'interface n'était pas adaptée pour cela, et il a dû changer toutes les définitions en type alias avec intersection / union.


Histoire

Après avoir changé le type de l'interface au type alias, ils ont confondu la syntaxe d'extension : ils ont essayé d'utiliser extends, au lieu de combiner avec &. L'erreur s'est manifestée tardivement et ils n'ont pas compris immédiatement la raison.