Les deux décrivent la forme des données et sont souvent interchangeables, mais ils ont des capacités différentes.
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
Les deux décrivent la forme des données et sont souvent interchangeables, mais ils ont des capacités différentes.
interface User { name: string; age: number; }
type User2 = { name: string; age: number; };
type peut faire que interface ne peut pastype ID = string | number; // unions
type Pair = [number, number]; // tuples
type Name = User["name"]; // indexed/mapped/conditional types
type Nullable<T> = T | null; // wrap any type
type est un alias général pour tout type — primitives, unions, tuples, mapped types. interface décrit uniquement les formes d'objets/fonctions.
interface peut faire que type ne peut pasinterface Box { width: number; }
interface Box { height: number; } // declaration merging — both merge into one
// Box now has width AND height
Les interfaces prennent en charge la declaration merging (plusieurs déclarations se combinent) et constituent la méthode idiomatique pour étendre/augmenter, y compris l'augmentation des types de bibliothèques tierces.
interface Admin extends User { role: string; } // interface
type Admin2 = User & { role: string }; // type uses intersection
Une convention courante : utilisez interface pour les formes d'objets et les API publiques (meilleurs messages d'erreur, extensible, fusionnable) et type lorsque vous avez besoin d'unions, de tuples ou d'autres opérations de type. Choisissez-en un comme valeur par défaut pour la cohérence — de nombreuses équipes utilisent interface par défaut pour les objets et ne recourent à type que lorsque sa puissance supplémentaire est nécessaire.