|
| 1 | +--- |
| 2 | +title: TypeScript pour les Développeurs Java/C# |
| 3 | +short: TS pour les Développeurs Java/C# |
| 4 | +layout: docs |
| 5 | +permalink: /fr/docs/handbook/typescript-in-5-minutes-oop.html |
| 6 | +oneline: Apprenez TypeScript si vous avez de l'expérience avec les langages orientés objet |
| 7 | +--- |
| 8 | + |
| 9 | +TypeScript est un choix populaire pour les développeurs habitués aux autres langages à typage statique, comme le C# et le Java. |
| 10 | + |
| 11 | +Le système de types de TypeScript offre la plupart de ces bénéfices : meilleure complétion de code, détection d'erreurs plus précoce, communication plus claire entre les composantes de votre programme. |
| 12 | +TypeScript fournit plusieurs fonctionnalités familières à ces développeurs, mais il est intéressant de faire un pas en arrière et apprendre comment le JavaScript (et par conséquent, TypeScript) diffère des langages orientés objet traditionnels. |
| 13 | +Comprendre ces différences vous permettra d'écrire du code JavaScript de meilleure qualité, et d'éviter les pièges communs dans lesquels les développeurs passant de C#/Java à TypeScript peuvent tomber. |
| 14 | + |
| 15 | +## Apprendre le JavaScript |
| 16 | + |
| 17 | +Si vous êtes déjà familier avec le JavaScript, mais vous êtes principalement un développeur Java ou C#, cette page d'introduction peut expliquer certaines idées fausses et pièges auxquels vous seriez susceptible. |
| 18 | +Certaines façons avec lesquelles TypeScript modélise les types sont très différentes du Java ou du C#. Il est important de s'en souvenir en apprenant TypeScript. |
| 19 | + |
| 20 | +Si vous êtes un développeur Java ou C#, et vous êtes nouveau avec JavaScript en général, nous recommandons d'apprendre un peu de JavaScript _sans les types_ d'abord, afin de comprendre son comportement lors de l'exécution. |
| 21 | +Vu que TypeScript ne change pas comment votre code _s'exécute_, vous devrez quand même apprendre le JavaScript pour écrire du code qui fait réellement quelque chose ! |
| 22 | + |
| 23 | +Il est important de se rappeler que TypeScript utilise le même _runtime_ que le JavaScript, donc toute ressource sur comment accomplir un comportement particulier (conversion d'un string à un nombre, affichage d'une alerte, écriture d'un fichier, etc.) s'appliquera également en TypeScript. |
| 24 | +Ne vous limitez pas à ce qui est spécifique à TypeScript ! |
| 25 | + |
| 26 | +## Repenser les classes |
| 27 | + |
| 28 | +Le C# et le Java sont ce qu'on pourrait appeler des langages à _POO obligatoire_. |
| 29 | +Dans ces langages, la _classe_ est l'unité basique d'organisation de code, ainsi que le conteneur de base de toutes les données _et_ de la logique à l'exécution. |
| 30 | +Obliger toute la fonctionnalité et toutes les données à être contenues dans des classes peut être un bon modèle de domaine pour certains problèmes, mais tous les modèles _ne doivent pas_ être représentés de cette façon. |
| 31 | + |
| 32 | +### Fonctions et données libres |
| 33 | + |
| 34 | +En JavaScript, les fonctions peuvent être placées n'importe où, et les données peuvent être librement relayées sans être cantonnées à une `class` ou une `struct`. |
| 35 | +Cette flexibilité est extrêmement puissante. |
| 36 | +Ces fonctions "libres" (celles qui ne sont pas associées à une classe), qui travaillent sur des données sans hiérarchie orientée objet, ont tendance à être le modèle préféré pour écrire un programme en JavaScript. |
| 37 | + |
| 38 | +### Classes statiques |
| 39 | + |
| 40 | +De plus, certaines structures du C# et du Java, comme les singletons et les classes statiques, ne sont pas nécessaires en TypeScript. |
| 41 | + |
| 42 | +## POO en TypeScript |
| 43 | + |
| 44 | +Cela dit, vous pouvez quand même utiliser des classes si vous le souhaitez ! |
| 45 | +Certains problèmes ont une solution qui correspond à l'approche POO classique, et la capacité de TypeScript à supporter les classes JavaScript rendra ces solutions encore plus puissantes. |
| 46 | +TypeScript supporte plusieurs patterns comme l'implémentation d'interfaces, l'héritage, et les méthodes statiques. |
| 47 | + |
| 48 | +Nous couvrirons les classes plus tard dans ce guide. |
| 49 | + |
| 50 | +## Repenser les types |
| 51 | + |
| 52 | +La façon dont TypeScript comprend la notion de _type_ est très différente du C# et du Java. |
| 53 | +Explorons certaines différences. |
| 54 | + |
| 55 | +### Systèmes de Types Nominaux Réifiés |
| 56 | + |
| 57 | +En C# ou Java, toute valeur a exactement un type - `null`, une primitive, ou un type de classe. |
| 58 | +Nous pouvons appeler des méthodes comme `value.GetType()` ou `value.getClass()` pour obtenir le type exact à l'exécution. |
| 59 | +La définition de ce type réside dans une certaine classe sous un certain nom, et nous n'avons pas le droit d'utiliser deux classes à formes similaires de façon interchangeable, sauf si une relation explicite d'héritage existe ou une interface en commun est implémentée. |
| 60 | + |
| 61 | +Ces aspects décrivent un système _réifié et nominal_ de types. |
| 62 | +Les types qu'on écrit sont présents à l'exécution, et ils sont liés à eux via leurs déclarations, pas leurs structures. |
| 63 | + |
| 64 | +### Types en tant qu'ensembles |
| 65 | + |
| 66 | +En C# ou Java, cela a du sens de faire une correspondance entre un type à l'exécution et sa déclarations à la compilation. |
| 67 | + |
| 68 | +En TypeScript, il vaut mieux de penser aux types comme des _ensembles de valeurs_ qui partagent quelque chose en commun. |
| 69 | +Parce que les types ne sont que des ensembles, une valeur peut appartenir à _plusieurs_ ensembles en même temps. |
| 70 | + |
| 71 | +Une fois que vous pensez aux types en tant qu'ensembles, certaines opérations deviennent naturelles. |
| 72 | +Par exemple, en C#, il est bizarre de transmettre une valeur qui est _soit_ un `string` ou `int`, parce qu'il n'existe aucun type les représentant tous les deux. |
| 73 | + |
| 74 | +En TypeScript, ce procédé devient naturel quand vous pensez aux types en tant qu'ensembles. |
| 75 | +Comment décrire une valeur qui appartient, soit à l'ensemble des `string`, soit à celui des `number` ? |
| 76 | +Elle appartient simplement à l'_union_ de ces ensembles : `string | number`. |
| 77 | + |
| 78 | +TypeScript fournit un certain nombre de mécanismes pour travailler avec les types de façons similaires à la théorie des ensembles, et ces façons seront plus intuitives si on pense aux types en tant qu'ensembles. |
| 79 | + |
| 80 | +### Types Structurels Effacés |
| 81 | + |
| 82 | +En TypeScript, les objets n'ont _pas_ de seul et unique type. |
| 83 | +Par exemple, si nous créons un objet qui correspond à une interface, nous pouvons utiliser cet objet là où l'interface est attendue même si aucune relation de déclaration n'existait entre les deux. |
| 84 | + |
| 85 | +```ts twoslash |
| 86 | +interface Pointlike { |
| 87 | + x: number; |
| 88 | + y: number; |
| 89 | +} |
| 90 | +interface Named { |
| 91 | + name: string; |
| 92 | +} |
| 93 | + |
| 94 | +function logPoint(point: Pointlike) { |
| 95 | + console.log("x = " + point.x + ", y = " + point.y); |
| 96 | +} |
| 97 | + |
| 98 | +function logName(x: Named) { |
| 99 | + console.log("Hello, " + x.name); |
| 100 | +} |
| 101 | + |
| 102 | +const obj = { |
| 103 | + x: 0, |
| 104 | + y: 0, |
| 105 | + name: "Origin", |
| 106 | +}; |
| 107 | + |
| 108 | +logPoint(obj); |
| 109 | +logName(obj); |
| 110 | +``` |
| 111 | + |
| 112 | +Le système de types de TypeScript est _structurel_, et non nominal : nous pouvons utiliser `obj` en tant que `Pointlike` parce qu'`obj` a les propriétés `x` et `y` qui sont toutes les deux des nombres. |
| 113 | +Les relations entre types sont déterminées par les propriétés qu'ils contiennent, et non pas avec une relation de déclaration entre eux. |
| 114 | + |
| 115 | +Le système de types de TypeScript n'est également _pas réifié_: rien ne va pouvoir nous dire qu'`obj` est un `Pointlike`, lors de l'exécution. |
| 116 | +D'ailleurs, le type `Pointlike` n'est _même pas présent_ lors de l'exécution. |
| 117 | + |
| 118 | +Si nous revenons à notre façon de réfléchir aux types _en tant qu'ensemble_, nous pouvons dire qu'`obj` est membre de l'ensemble `Pointlike`, ainsi que de l'ensemble `Named`. |
| 119 | + |
| 120 | +### Conséquences du typage structurel |
| 121 | + |
| 122 | +Deux aspects particuliers de ce système surprennent souvent les développeurs POO. |
| 123 | + |
| 124 | +#### Types vides |
| 125 | + |
| 126 | +Le premier est que le _type vide_ a l'air d'agir de manière impromptue : |
| 127 | + |
| 128 | +```ts twoslash |
| 129 | +class Empty {} |
| 130 | + |
| 131 | +function fn(arg: Empty) { |
| 132 | + // fais quelque chose ? |
| 133 | +} |
| 134 | + |
| 135 | +// Pas d'erreur, mais ce n'est pas un Empty ? |
| 136 | +fn({ k: 10 }); |
| 137 | +``` |
| 138 | + |
| 139 | +TypeScript détermine si l'appel à `fn` est valide en déterminant si l'argument fourni est un `Empty` valide. |
| 140 | +Cela est accompli en examinant la _structure_ de `{ k: 10 }` et `class Empty { }`. |
| 141 | +Nous pouvons voir que `{ k: 10 }` a _toutes_ les propriétés d'`Empty` vu qu'`Empty` n'a aucune propriété. |
| 142 | +C'est donc un appel valide ! |
| 143 | + |
| 144 | +Cela peut paraître surprenant, mais c'est au final une relation très similaire à celle respectées dans les langages POO nominaux. |
| 145 | +Une sous-classe ne peut pas _retirer_ une propriété de sa classe-mère, parce que faire cela détruirait la relation de sous-type naturelle existant entre la sous-classe et sa classe-mère. |
| 146 | +Les systèmes de type structurels identifient cette relation en décrivant les sous-types de façon à avoir des propriétés à types compatibles. |
| 147 | + |
| 148 | +#### Types identiques |
| 149 | + |
| 150 | +Les types identiques sont une autre source fréquente de surprises : |
| 151 | + |
| 152 | +```ts |
| 153 | +class Car { |
| 154 | + drive() { |
| 155 | + // accélérer |
| 156 | + } |
| 157 | +} |
| 158 | +class Golfer { |
| 159 | + drive() { |
| 160 | + // frapper la balle fort |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +// Pas d'erreur ? |
| 165 | +let w: Car = new Golfer(); |
| 166 | +``` |
| 167 | + |
| 168 | +Encore une fois, ceci n'est pas une erreur parce que les _structures_ de ces classes sont les mêmes. |
| 169 | +Cela peut paraître comme une source de confusion, mais en pratique, les classes identiques n'ayant aucun rapport ne sont pas communes. |
| 170 | + |
| 171 | +Nous apprendrons plus sur comment les classes sont liées l'une à l'autre dans leur chapitre. |
| 172 | + |
| 173 | +### Réflexivité |
| 174 | + |
| 175 | +Les développeurs POO ont l'habitude de pouvoir demander le type de n'importe quelle valeur, même générique : |
| 176 | + |
| 177 | +```csharp |
| 178 | +// C# |
| 179 | +static void LogType<T>() { |
| 180 | + Console.WriteLine(typeof(T).Name); |
| 181 | +} |
| 182 | +``` |
| 183 | + |
| 184 | +Mais parce que le système de types de TypeScript est complètement effacé, aucune information sur, par exemple, l'instanciation d'un type générique n'est disponible à l'exécution. |
| 185 | + |
| 186 | +JavaScript possède quelques opérateurs comme `typeof` et `instanceof`, mais souvenez-vous que ces opérateurs agissent sur les valeurs, tel qu'elles existent dans le code sans informations de types. |
| 187 | +Par exemple, `typeof (new Car())` va retourner `"object"`, et non `Car` ni `"Car"`. |
| 188 | + |
| 189 | +## Prochaines étapes |
| 190 | + |
| 191 | +C'était un bref résumé de la syntaxe et des outils régulièrement utilisés en TypeScript. À partir de là, vous pourrez : |
| 192 | + |
| 193 | +- Lire le Manuel [du début à la fin](/docs/handbook/intro.html) (30m) |
| 194 | +- Explorer les [exemples du bac à sable](/play#show-examples) |
0 commit comments