Type, interface et classe en TypeScript et savoir quand les utiliser

1.Type
Le mot-clé type permet de créer une alias (un raccourci) pour n’importe quelle structure :
Ce qu’un type peut représenter, un objet, une union, une fonction, un tuple, un type primitif personnalisé
Exemple :
type User = {
id: number;
name: string;
};
type Status = "active" | "inactive";
type Point = [number, number];
type Callback = (value: number) => void;
Avantages des type :
- Plus flexible
Exemple: type Result<T> = T | Error;
Limitations :
- Ne supporte pas l’héritage classique comme interface extends (même si on peut faire &)
Quand utiliser type ?
Utilise type lorsque :
- vous avez besoin de définir un type complexe : union, intersection, tuple, fonction
Exemple :
type ApiResponse<T> = T | null;
type Status = "pending" | "approved" | "rejected";
Idéal pour la logique, les modèles de données abstraits, les types avancés.
2. L'interface
Une interface sert exclusivement à décrire la forme d’un objet.
Exemple:
interface User {
id: number;
name: string;
}
Avantages des interface :
- Supporte l’héritage multiple
interface A { a: string; }
interface B { b: number; }
interface C extends A, B {}
- Peut être déclarée plusieurs fois, Recommandée pour des objets structurés
interface User {
age: number;
}
Limitations :
Ne supporte pas les types complexes comme les unions
Exemple :
interface Status = "active" | "inactive"
Quand utiliser interface ?
Utilise interface lorsque :
- vous décrivez un objet (modèle, DTO, entité, paramètres…)
Exemple :
interface User {
id: number;
name: string;
}
interface Admin extends User {
role: string;
}
Recommandée pour les objets structurés, la modélisation, l’héritage propre.
3. La class
Une classe définit :
- des propriétés
Exemple :
class User {
constructor( public id: number, public name: string) {}
display() {
console.log(this.name);
}
}
Avantages des classes:
- Logique réutilisable (méthodes, constructeurs)
Limitations :
- Plus lourde qu’un simple type ou interface
Quand utiliser class ?
Utilise class lorsque :
- tu dois gérer une instanciation (new User())
Exemple :
class User {
constructor(private name: string) {}
getName() {
return this.name;
}
}
Pour le code orienté-objet, la logique métier, les modèles actifs.