TypeScript - Étendre les Interfaces

Bonjour, futurs superstars du codage ! Aujourd'hui, nous allons plonger dans le monde passionnant des interfaces TypeScript et apprendre comment les étendre. À la fin de cette leçon, vous serez en mesure de créer des interfaces puissantes et flexibles comme un pro. Alors, prenez votre boisson favorite, installez-vous confortablement, et commencer notre voyage !

TypeScript - Extending Interfaces

Syntaxe

Avant de rentrer dans les détails, penchons-nous sur les bases. En TypeScript, étendre une interface est aussi simple que d'utiliser le mot-clé extends. Voici la syntaxe générale :

interface EnfantInterface extends ParentInterface {
// Propriétés ou méthodes supplémentaires
}

Pensez-y comme l'héritage dans une famille royale. L'interface enfant "hérite" de toutes les propriétés et méthodes de l'interface parent, et peut également ajouter ses propres fonctionnalités uniques.

Étendre une Unique Interface

Commençons par un exemple simple. Imaginons que nous créons un jeu sur des créatures magiques. Nous commencerons par une interface de base Creature :

interface Creature {
name: string;
age: number;
}

Maintenant, disons que nous voulons créer un type spécial de créature - un dragon ! Nous pouvons étendre l'interface Creature pour créer une interface Dragon :

interface Dragon extends Creature {
breatheFire: () => void;
wingspan: number;
}

Dans cet exemple, Dragon hérite des propriétés name et age de Creature, et ajoute sa propre méthode breatheFire et propriété wingspan.

Voyons comment nous pouvons utiliser cela :

const smaug: Dragon = {
name: "Smaug",
age: 1000,
wingspan: 200,
breatheFire: () => console.log("Rugissement ! ?")
};

console.log(smaug.name);  // Sortie : Smaug
smaug.breatheFire();  // Sortie : Rugissement ! ?

Comme vous pouvez le voir, smaug a toutes les propriétés d'une Creature, plus les fonctionnalités spécifiques au dragon.

Étendre Plusieurs Interfaces

Que se passe-t-il si notre dragon n'est pas seulement une créature, mais aussi un gardien de trésors ? En TypeScript, nous pouvons étendre plusieurs interfaces ! Créons une interface TreasureKeeper et étendons les deux :

interface TreasureKeeper {
treasureCount: number;
addTreasure: (item: string) => void;
}

interface DragonLord extends Creature, TreasureKeeper {
breatheFire: () => void;
wingspan: number;
}

Maintenant, notre DragonLord est une créature qui peut à la fois cracher du feu et accumuler des trésors. Génial, non ?

const falkor: DragonLord = {
name: "Falkor",
age: 500,
wingspan: 150,
treasureCount: 1000,
breatheFire: () => console.log("Whoosh ! ?"),
addTreasure: (item) => console.log(`Ajouté ${item} au trésor !`)
};

falkor.addTreasure("Couronne dorée");  // Sortie : Ajouté Couronne dorée au trésor !

Améliorer une Interface Existante

Parfois, vous pourriez vouloir ajouter plus de propriétés à une interface existante. TypeScript vous permet de faire cela en déclarant à nouveau l'interface avec les nouvelles propriétés :

interface Creature {
species: string;
}

const unicorn: Creature = {
name: "Sparkles",
age: 100,
species: "Licorne"
};

Maintenant Creature a les propriétés name, age, et species. Cette technique est appelée "fusion de déclarations".

Créer des Interfaces Composites

Vous pouvez également créer de nouvelles interfaces en combinant des interfaces existantes en utilisant les types d'intersection :

interface Flyer {
fly: () => void;
}

interface Swimmer {
swim: () => void;
}

type FishVolant = Flyer & Swimmer;

const nemo: FishVolant = {
fly: () => console.log("Je vole ! ?✈️"),
swim: () => console.log("Juste continue de nager ! ?‍♂️")
};

nemo.fly();  // Sortie : Je vole ! ?✈️
nemo.swim();  // Sortie : Juste continue de nager ! ?‍♂️

Surcharger les Propriétés et les Méthodes

Lors de l'extension des interfaces, vous pouvez surcharger les propriétés et les méthodes de l'interface parent. Cela est utile lorsque vous souhaitez être plus spécifique sur une propriété ou une méthode dans l'interface enfant :

interface Animal {
makeSound: () => void;
}

interface Cat extends Animal {
makeSound: () => string;  // Type de retour plus spécifique
}

const kitty: Cat = {
makeSound: () => "Miaou !"
};

console.log(kitty.makeSound());  // Sortie : Miaou !

Dans cet exemple, nous avons surchargé la méthode makeSound pour qu'elle retourne une chaîne de caractères au lieu de void.

Voici un tableau résumant les méthodes que nous avons couvertes :

Méthode Description
Étendre une Unique Interface Utilisez le mot-clé extends pour hériter d'une interface
Étendre Plusieurs Interfaces Utilisez extends avec des interfaces séparées par des virgules
Améliorer une Interface Existante Déclarez à nouveau l'interface avec les nouvelles propriétés
Créer des Interfaces Composites Utilisez les types d'intersection (&) pour combiner des interfaces
Surcharger les Propriétés et les Méthodes Redéfinissez les propriétés ou les méthodes dans l'interface enfant

Et voilà, les amis ! Vous venez de monter en niveau vos compétences TypeScript en maîtrisant l'extension des interfaces. Souvenez-vous, les interfaces sont comme des briques LEGO - vous pouvez les combiner de manière infinie pour construire des structures complexes et sécurisées dans votre code.

Alors, continuez votre voyage de codage, vous trouverez que ces techniques vous aideront à créer du code plus flexible, réutilisable et maintenable. Allez-y et interfacez avec confiance ! Bon codage ! ??‍??‍?

Credits: Image by storyset