Skip to content

Commit 6520df1

Browse files
Merge pull request #137 from mk360/fr-trans-oop
Co-authored-by: Ascor8522 <[email protected]>
2 parents 4b695cb + 324ae27 commit 6520df1

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
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

Comments
 (0)