ProgrammationDéveloppeur Frontend

Comment fonctionne la typage des classes et l'héritage en TypeScript ? Quelles sont les particularités de la déclaration des propriétés et des méthodes, quels problèmes peuvent survenir et comment les résoudre ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question

Les types de classes et l'héritage ont été ajoutés à TypeScript pour supporter des modèles orientés objet, familiers dans d'autres langages (Java, C#). TypeScript permet de créer des classes avec des types de propriétés et de méthodes explicitement définis, ainsi que d'implémenter l'héritage avec sécurité de type.

Problème

Sans typage explicite en JavaScript, les erreurs liées à une utilisation incorrecte des propriétés ne sont pas détectées lors de la compilation. Les problèmes surviennent lors de la redéfinition des méthodes/propriétés par les descendants, en cas de non-respect du contrat de la classe de base et d'une mauvaise manipulation des membres protected/private.

Solution

TypeScript permet d'utiliser les mots-clés public, private, protected, de spécifier explicitement les types des propriétés et des méthodes, d'hériter des classes à l'aide de extends et de mettre en œuvre des interfaces.

Exemple de code :

class Animal { public name: string; protected age: number; private secret: string = "hidden"; constructor(name: string, age: number) { this.name = name; this.age = age; } speak(): void { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { constructor(name: string, age: number) { super(name, age); } speak(): void { console.log(`${this.name} barks.`); } } const dog = new Dog("Rex", 4); dog.speak(); // Rex barks.

Principales caractéristiques :

  • Déclaration explicite des types des propriétés et des méthodes de la classe
  • Utilisation des modificateurs d'accès pour l'encapsulation
  • Support de l'héritage et redéfinition des méthodes avec contrôle des types

Questions piégées.

Que se passe-t-il si le type d'un champ de classe n'est pas spécifié ?

TypeScript essaiera de déduire le type à partir de la valeur assignée, si elle existe. Si ce n'est pas le cas, le type sera any, ce qui réduit la sécurité du code.

class Test { value; constructor(v: number) { this.value = v; } }

value sera de type any, s'il n'y a pas de valeur par défaut spécifiée — une faille potentielle dans la sécurité des types.

Peut-on changer le modificateur d'accès d'une méthode héritée ?

Oui, mais uniquement en l'intensifiant (par exemple, de public à protected ou private — ce n’est pas permis), mais passer de private à public n'est pas possible, car un membre private n'est pas hérité. Cela entraînera une erreur de compilation.

Peut-on hériter de plusieurs classes en TypeScript ?

Non, l'héritage multiple des classes est interdit. On peut implémenter plusieurs interfaces, mais seulement une seule classe peut être étendue.

Erreurs typiques et anti-modèles

  • Non spécification des types des propriétés entraîne un implicit any
  • Mauvaise redéfinition des méthodes (avec des signatures non correspondantes)
  • Non-respect de l'encapsulation (ouverture des propriétés privées)

Exemple de la vie réelle

Cas négatif

Dans le projet, toutes les classes étaient déclarées sans modificateurs d'accès et types explicites, pour accélérer le développement.

Avantages :

  • Prototypage rapide

Inconvénients :

  • Difficile à suivre les erreurs d'accès
  • Bugs fréquents dus à une redéfinition involontaire des propriétés

Cas positif

Tous les membres de la classe sont soigneusement typés, utilisant private/protected/public, typage strict des propriétés et méthodes.

Avantages :

  • Prévention des erreurs au stade de la compilation
  • Architecture claire, facile à comprendre la structure des objets

Inconvénients :

  • Nécessite plus de temps pour la conception, moins de flexibilité dans les tâches expérimentales