JSJS MemođŸŽ™ïž Coach

Public Vs Private Vs Protected

| public | Les variables, mĂ©thodes ou classes publiques sont accessibles par tout objet. | | :---- | :---- | | | Les variables, mĂ©thodes ou classes dĂ©finies sans modificateur sont accessibles par toute classe appartenant au mĂȘme package. | | protected | Les variables, mĂ©thodes ou classes dĂ©finies comme protĂ©gĂ©es ne sont accessibles que par les classes filles et classes du mĂȘme package. | | private | Les variables, mĂ©thodes ou classes dĂ©finies comme privĂ©es ne sont accessibles que par la classe dans laquelle elles sont dĂ©finies. |

Principe OP

Héritage

L'héritage consiste à organiser les classes entre « mÚre » et « filles » en utilisant le mot clé « extends ».

  • Polymorphisme

Polymorphisme

Polymorphisme permet de manipuler des objets sans vraiment connaßtre leur type ou c'est la définition des méthodes de plusieurs maniÚres par exemple : la méthode Compte() est définit dans les classes filles par CompteEpargne(), CompteSimple(), ComptePayant() ; Classe Object qui sont (trÚs) souvent redéfinies pour bénéficier des avantages du polymorphisme : equals(), toString() et hashCode()

Remarque : L'héritage désigne l'utilisation de la structure et du comportement d'une super classe dans une sous-classe. Bien que le polymorphisme se réfÚre à la modification du comportement d'une super-classe dans une sous-classe.

Encapsulation

Encapsulation est implémenté en combinant les méthodes et les attributs dans une classe.

En utilisant les accesseurs modificateurs pour avoir accÚs aux variables déclarées private hors de la classe.

Abstraction

L'abstraction est un processus consistant Ă  masquer les dĂ©tails de la mise en Ɠuvre et Ă  afficher uniquement les fonctionnalitĂ©s de l'utilisateur.

Par exemple, l'envoi de SMS Ă  l'endroit oĂč vous tapez le texte et envoyez le message.

Vous ne connaissez pas le traitement interne relatif Ă  la livraison du message.

L'abstraction vous permet de vous concentrer sur ce que fait l'objet au lieu de savoir comment il le fait.

Il y a deux façons de réaliser l'abstraction :

  • Classe abstrait
  • Interface

Classe abstraite Une classe abstraite est une classe qui ne peut pas ĂȘtre instanciĂ©e mais rien ne l'empĂȘche d'avoir des mĂ©thodes, un constructeur et tout autre chose que la classe normale peut avoir.

Interface

Interface est une classe 100% abstraite permettant de créer un nouveau super type et jouir du polymorphisme.

Interface VS Abstraite

Une classe abstraite utilise le mot clĂ© « abstract » et aussi peut contenir des mĂ©thodes abstraites et des mĂ©thodes avec leur traitement au contraire de l'interface qui contient sauf les entĂȘtes ou signatures des mĂ©thodes. Une interface est une classe entiĂšrement abstraite.

| Abstraite | Interface | | :---- | :---- | | Sert à factoriser du code | Sert à définir des contrats de services | | le nombre de classes mÚres d'une sous-classe est limité, l'implémentation d'une classe abstraite impose d'hériter de cette classe | il est généralement possible d'implémenter plusieurs interfaces dans une classe |

Surcharge (Overloading) VS Redéfinition(Overriding)

La surcharge survient lorsque deux mĂ©thodes ou plus dans une classe ont le mĂȘme nom de mĂ©thode mais des paramĂštres diffĂ©rents.

RedĂ©finition signifie avoir deux mĂ©thodes avec le mĂȘme nom de mĂ©thode et les mĂȘmes paramĂštres, l'une des mĂ©thodes est dans la classe parente et l'autre dans la classe fille.

![Résultat de recherche d'images pour "difference entre surcharge de methode et redefinition en java"][image1]

Typescript

TypeScript est un langage de programmation. Il s'agit d'un sur-ensemble de JavaScript qui ajoute des fonctionnalités de typage statique et de compilation statique optionnelle. TypeScript permet aux développeurs d'écrire du code JavaScript de maniÚre plus structurée en utilisant des types, ce qui facilite la détection précoce d'erreurs et améliore la maintenabilité du code.

Avantage de Typescript

L'un des principaux avantages de l'utilisation de TypeScript par rapport à JavaScript est la vérification statique des types. TypeScript permet de définir des types pour les variables, les paramÚtres de fonction, les propriétés d'objet, etc. Cela aide à détecter les erreurs de typage dÚs la phase de développement, avant l'exécution du code.

Le compilateur TypeScript lui-mĂȘme est responsable de la dĂ©tection des erreurs de typage.

  • tsc nom de file .ts
  • IntĂ©gration avec les IDE

Principale caractéristique de Typescript

Les principales caractéristiques de TypeScript comprennent le typage statique, l'inférence de type, la compatibilité ECMAScript, les outils de développement avancés, la facilité d'intégration, la gestion avancée des modules et l'écosystÚme dynamique.

Typescript Vs Javascript

Les principales différences entre TypeScript et JavaScript résident dans le typage statique, les extensions du langage, la nécessité de compilation,

JavaScript, est un langage de script dynamique et interprété

Type

Les types permettent de spécifier les types des variables, des paramÚtres de fonction, des valeurs de retour et des propriétés d'objets. Ils permettent de définir le comportement attendu des données.

Type Inference

L'inférence de type (Type Inference) qui permet au compilateur de déduire automatiquement les types des variables lorsque les annotations de type ne sont pas spécifiées.

Lorsque on déclare une variable et qu'on lui affecte une valeur lors de sa création, le compilateur TypeScript analyse la valeur assignée et infÚre le type approprié en se basant sur cette valeur. Il déduit le type de la variable en fonction de la forme et de la structure de la valeur assignée.

Type Conditionnals

Les types conditionnels permettent de dĂ©finir des types en fonction de conditions sur d'autres types. Ils sont utilisĂ©s pour effectuer des branches conditionnelles basĂ©es sur les types. Par exemple, le type Exclude\<T, U> exclut les types de U d'un union de types T. Les types conditionnels peuvent ĂȘtre utilisĂ©s pour crĂ©er des types gĂ©nĂ©riques flexibles et pour effectuer des opĂ©rations de filtrage sur les types.

Generics Type

Les types génériques permettent de créer des composants et des fonctions réutilisables qui peuvent travailler avec différents types de données. Ils permettent de définir des paramÚtres de type génériques qui sont résolus lors de l'utilisation du composant ou de la fonction. Par exemple, Array\<T> est un type générique qui représente un tableau contenant des éléments de type T. Les types génériques offrent une flexibilité et une réutilisabilité

Literal Type

Literal Type permet de définir des types spécifiques en utilisant des valeurs littérales. Par exemple, type MyBoolean \= true | false; définit un type MyBoolean qui peut avoir uniquement les valeurs true ou false.

Literal Assertion

Une type assertion sert Ă  informer le compilateur du type exact d'une valeur. Je l'utilise pour affiner l'infĂ©rence quand TypeScript ne peut pas le dĂ©duire tout seul, par exemple pour caster un Element en HTMLInputElement. Je reste prudent, car une assertion ne fait aucune vĂ©rification runtime — c'est donc Ă  moi de garantir que le type est correct.

Intersection and Union Type

Intersection permet de combiner plusieurs types en un seul.

Union permet de spécifier qu'une variable peut avoir plusieurs types possibles.

https://www.typescriptlang.org/fr/docs/handbook/2/everyday-types.html

| Utility Type | Description | | :---- | :---- |

Partial\<T>

Rend toutes les propriétés de T optionnelles.

Generic

Generic permettent d'écrire des fonctions ou composants réutilisables tout en conservant un typage fort. Le type est injecté au moment de l'utilisation.

Ainsi TypeScript connaßt automatiquement les colonnes disponibles, l'autocomplétion fonctionne et les erreurs sont détectées à la compilation. On gagne en réutilisabilité sans perdre en sécurité.

Required\<T>

Rend toutes les propriétés de T obligatoires (opposé de Partial).

Readonly\<T>

Rend toutes les propriétés de T en lecture seule (immuables). rend toutes les propriétés optionnelles.

Pick\<T, K>

Construit un type en sélectionnant certaines clés K de T.

IL permet de garder seulement certaines propriétés.

Omit\<T, K>

Construit un type en excluant certaines clés K de T. il permet d'enlever certaines propriétés.

Record\<K, T>

Crée un objet avec des clés K et des valeurs de type T.

Exclude\<T, U>

Retire de T les membres qui sont assignables Ă  U.

Extract\<T, U>

Garde dans T seulement les membres qui sont assignables Ă  U.

NonNullable\<T>

Supprime null et undefined d'un type.

ReturnType\<T>

Extrait le type de retour d'une fonction.

Parameters\<T>

Extrait les types des paramĂštres d'une fonction sous forme de tuple.

ConstructorParameters\<T>

Extrait les types des paramĂštres du constructeur d'une classe.

InstanceType\<T>

Extrait le type de l'instance créée par un constructeur.

Awaited\<T> (TS 4.5+)

Extrait le type résolu d'une Promise (y compris nested Promises).

Intersection

L'intersection nous permet de combiner plusieurs types en un seul type. Pour créer un type d'intersection, nous devons utiliser le mot- & clé :

type Name \= { name: "string" };

type Age \= { age: number };

type Person \= Name & Age;

interface Name { name: "string" };

interface Age { age: number };

type Person \= Name & Age;

Unions

Les types d'union nous permettent de créer un nouveau type qui peut avoir une valeur d'un ou de plusieurs types. Pour créer un type d'union, on devra utiliser le mot-|clé |.

type Man \= { name: "string" };

type Woman \= { name: "string" };

type Person \= Man | Woman;

interface Man { name: "string" };

interface Woman { name: "string" };

type Person \= Man | Woman;

Tuples

Un tuple est un tableau à longueur fixe avec des types prédéfinis pour chaque position.

Contrairement Ă  un tableau classique oĂč tous les Ă©lĂ©ments sont du mĂȘme type, un tuple permet d'avoir des Ă©lĂ©ments hĂ©tĂ©rogĂšnes mais ordonnĂ©s.

never, unknown et any sont trois types distincts en TypeScript, et chacun a une utilité différente :

Any Vs unknown Vs Never

Any : Elle peut ĂȘtre utilisĂ©e pour reprĂ©senter n'importe quel type, et permet d'effectuer n'importe quelle opĂ©ration sur elle. quand on utilise any, elle dĂ©sactive la vĂ©rification de type de TypeScript pour cette valeur, c'est dĂ©conseillĂ©e en gĂ©nĂ©ral car elle peut conduire Ă  des erreurs d'exĂ©cution et rendre le code plus difficile Ă  maintenir.

unknown c'est un type qui est utilisé pour représenter des valeurs dont le type n'est pas connu. Contrairement à any, unknown est une alternative sûre, sur le plan des types qui peut aider à détecter les erreurs de type à la compilation. On peut affecter une valeur unknown à n'importe quel autre type, mais on ne peut pas effectuer d'opérations sur elle sans d'abord en affiner le type. On peut le faire en utilisant une garde de type ou une assertion de type.

Never c'est un type qui représente des valeurs qui ne peuvent jamais se produire. Il est utilisé pour indiquer qu'une fonction ne retournera pas ou qu'une variable n'est pas initialisée ou a une valeur inaccessible. Par exemple, une fonction qui lance une erreur ou entre dans une boucle infinie a un type de retour never.

Any dĂ©sactive TypeScript. Avec any, je peux faire n'importe quoi, mĂȘme appeler une mĂ©thode qui n'existe pas.

Unknown, au contraire, oblige à vérifier le type avant de l'utiliser.

Types vs. Interfaces

Les deux permettent de décrire la forme d'un objet.

  • j'utilise souvent interface pour reprĂ©senter des contrats objets extensibles, par exemple un modĂšle mĂ©tier ou les props d'un composant.
  • J'utilise plutĂŽt type quand j'ai besoin de composer des types plus avancĂ©s : unions, intersections, mapped types, utility types.

L'interfaces est un moyen de décrire des formes de données, par exemple, un objet.

Le type est une définition d'un type de données, par exemple, une union, une primitive, une intersection, un tuple ou tout autre type.

L'interface fonctionne mieux avec les objets et les objets de méthode, et les types fonctionnent mieux avec les fonctions, les types complexes, etc.

Pour définir les props d'un composant, je peux utiliser type ou interface, mais je choisis en fonction du besoin :

  • Si je veux juste dĂ©crire la forme d'un objet et pouvoir l'Ă©tendre ailleurs, j'ai tendance Ă  utiliser une interface.
  • Si j'ai besoin de combiner plusieurs types avec des unions (|) ou intersections (&), ou que mes props incluent d'autres formes comme des tuples ou des alias complexes, je prĂ©fĂšre type.

En pratique, pour des props simples et extensibles, j'utilise souvent interface par convention, car elle supporte l'extension déclarative (on peut la merger). Pour des types plus composés ou avancés, type est plus puissant.

Différences fondamentales

  • Merging: interface peut ĂȘtre fusionnĂ©e (declaration merging), type non.
  • Unions: type gĂšre | nativement; interface non.
  • Extends: interface → extends; type → intersection &.

Interface & intersection

extends est une relation de héritage entre interfaces, idéale pour modéliser des hiérarchies et des contrats extensibles.

& crée un type intersection, plus flexible car il fonctionne sur n'importe quel type, mais il peut produire des types impos

Type guards

Type guard est une technique utilisée pour affiner ou vérifier le type d'une variable dans une partie donnée du code. Cela permet à TypeScript de savoir, à l'exécution, qu'une variable est d'un type spécifique, ce qui permet d'accéder en toute sécurité aux propriétés ou méthodes propres à ce type. Les type guards s'appuient sur des conditions logiques (comme les opérateurs typeof, instanceof, ou des fonctions personnalisées) pour aider TypeScript à déduire le type exact d'une variable

Avec typeof Utilisé pour vérifier les types primitifs comme string, number, boolean, etc.

Avec instanceof Utilisé pour vérifier si un objet est une instance d'une classe.

Avec des fonctions personnalisées La fonction doit utiliser une assertion de type sous la forme : variable is Type

As (assertion)

As est une assertion de type : on dit au compilateur « considÚre cette valeur comme ce type ».

Elle ne change rien au runtime et peut forcer un type mĂȘme si le compilateur n'est pas sĂ»r — Ă  utiliser seulement quand on est certain du type rĂ©el.

Satisfies

Satifies c'est un opérateur de vérification : il s'assure qu'une valeur respecte un type tout en gardant son type précis et en signalant les clés en trop.

C'est plus sûr que as car ça ne masque pas les erreurs et garde l'inférence intacte.

As Vs Satifies

as force un type (mĂȘme si c'est risquĂ©) et peut masquer des erreurs, alors que satisfies vĂ©rifie que la valeur respecte le type sans perdre l'infĂ©rence et signale les propriĂ©tĂ©s en trop.

StrictNullChecks

StrictNullChecks est une option du compilateur TypeScript qui empĂȘche d'utiliser null ou undefined comme si c'Ă©tait des valeurs valides d'un type sans les dĂ©clarer explicitement.

Autrement dit, si elle est activée, string signifie vraiment "jamais null ou undefined", et on doit gérer ces cas de façon explicite. Cela réduit fortement les bugs à l'exécution.

Symbol

symbol est un type primitif qui sert à créer des identifiants uniques.

Chaque Symbol() est garanti unique, mĂȘme si on lui donne la mĂȘme description.

On l'utilise pour créer des clés d'objet impossibles à écraser par accident, ou pour des concepts spéciaux comme les well-known symbols (ex. Symbol.iterator)

Narrowing

Narrowing c'est le processus par TypeScript qui permet de réduire un type plus large (union, unknown, any) à un type plus précis grùce à des vérifications de code.

Cela permet d'avoir une autocomplétion correcte et d'éviter les erreurs au runtime

Cinq techniques font partie des moyens de narrowing

typeof

Utilisé pour affiner un type en fonction de son type primitif à l'exécution.

instanceof

Affiner un type en vérifiant si l'objet est instance d'une classe.

Equality checks

Comparer une valeur avec null ou undefined pour affiner.TrÚs utile avec strictNullChecks activé pour éviter les erreurs.

Property checks (in)

Tester la présence d'une propriété pour savoir quel type est actif.

User-defined type guards

Créer ta propre fonction de narrowing.

TypeScript reconnaßt les fonctions qui retournent un type prédicat (x is Type).

keyof

keyof me permet d'obtenir l'union des noms de propriétés d'un type pour créer des fonctions et des utilitaires génériques 100 % type-safe. Par exemple, je peux forcer qu'une clé passée en paramÚtre existe réellement sur l'objet, ce qui élimine toute une classe d'erreurs.

Utilisation

  • CrĂ©er des fonctions gĂ©nĂ©riques type-safe
  • CrĂ©er des types dynamiques

Mapped Types

Mapped Types permettent de transformer un type existant en itérant sur ses clés (keyof) pour produire un nouveau type.

C'est un peu comme faire un map sur les propriétés d'un objet, mais au niveau du systÚme de type.

Key Remapping

Key Remapping(TypeScript 4.1) permet de renommer, filtrer ou transformer les clés d'un type lors d'un mapped type.

On utilise la syntaxe as dans la clause [K in keyof T as ...].

Decorator

Un decorator est une fonction spĂ©ciale qui peut ĂȘtre appliquĂ©e Ă  une classe, une mĂ©thode, une propriĂ©tĂ© ou un paramĂštre pour ajouter du comportement ou des mĂ©tadonnĂ©es.

C'est comme un "middleware" au niveau du code : il intercepte et enrichit la définition.

C'est un feature expĂ©rimentale (TS doit ĂȘtre configurĂ© avec experimentalDecorators: true)

Types de decorators

  • Class Decorator: Agit sur une classe entiĂšre.
  • Property Decorator: AppliquĂ© sur une propriĂ©tĂ©.
  • Method Decorator: AppliquĂ© sur une mĂ©thode pour modifier son comportement.
  • Parameter Decorator: AppliquĂ© sur un paramĂštre d'une mĂ©thode pour stocker des infos.

Const Vs Let Vs Var

CONST

  • Const a besoin d'ĂȘtre dĂ©clarĂ© avec une valeur initiale. La portĂ©e de const est celle du bloc
  • On ne peut pas changer sa valeur aprĂšs dĂ©claration
  • Avec const pour objet, on peut changer les propriĂ©tĂ©s d'un objet existant mais ne pas RĂ©assigner un nouvel objet
  • Const n'est pas hosting

LET

  • Il n'est pas obligatoire de dĂ©clarer une variable avec sa valeur initiale.
  • On peut modifier sa valeur aprĂšs sa dĂ©claration
  • Elle est limitĂ©e Ă  celle du bloc courant
  • LET n'est pas hosting

VAR : permet de dĂ©clarer des variables qui ont une portĂ©e globale ou de fonction, c'est-Ă -dire qu'elles peuvent ĂȘtre utilisĂ©es partout dans le code Ă  l'intĂ©rieur de leur portĂ©e. Les variables var peuvent ĂȘtre rĂ©affectĂ©es avec une nouvelle valeur. Si une variable var est dĂ©clarĂ©e sans ĂȘtre initialisĂ©e, elle aura la valeur undefined.

Triple-slash directives

Les triple-slash directives sont des commentaires spéciaux comme /// \<reference types="node" /> qui indiquent au compilateur d'inclure certains fichiers ou définitions de type. Je les utilise surtout dans les .d.ts ou pour inclure les types globaux d'une lib (Node, Jest) dans un projet qui n'a pas d'import explicite.

Module

Un module en TypeScript est simplement un fichier avec un scope propre qui exporte et importe explicitement ses symboles. Cela permet d'avoir un code isolé, maintenable et tree-shakable. J'utilise systématiquement les ES Modules (import/export) et j'évite les scripts globaux pour prévenir les collisions et améliorer la lisibilité.