Les deux mécanismes — interface et type alias — permettent de décrire des structures de données (objets, fonctions, types complexes).
Différences :
|) 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 :
interface.type.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 }
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.