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é.