|
| 1 | +--- |
| 2 | +title: TypeScript pour les développeurs JavaScript |
| 3 | +short: TypeScript pour les développeurs JS |
| 4 | +layout: docs |
| 5 | +permalink: /fr/docs/handbook/typescript-in-5-minutes.html |
| 6 | +oneline: Apprenez comment TypeScript étend JavaScript |
| 7 | +--- |
| 8 | + |
| 9 | +TypeScript a une relation inhabituelle avec JavaScript. TypeScript offre toutes les fonctionnalités de JavaScript, avec une couche supplémentaire de fonctionnalités : le système de typage. |
| 10 | + |
| 11 | +JavaScript fournit des primitives, comme `string` et `number`, mais aucune vérification n'est faite pour s'assurer que les assignations que vous faites sont correctes. TypeScript le fait. |
| 12 | + |
| 13 | +Cela signifie que votre code JavaScript existant est également du code TypeScript. L'avantage principal de TypeScript est sa capacité à exposer les comportements imprévus dans votre code, diminuant les risques de bugs. |
| 14 | + |
| 15 | +Ce tutoriel fournira une vue d'ensemble de TypeScript, et va se concentrer sur son système de typage. |
| 16 | + |
| 17 | +## Types par Inférence |
| 18 | + |
| 19 | +TypeScript connaît le JavaScript et générera les types pour vous la plupart du temps. |
| 20 | +Par exemple, en créant une variable et en lui assignant une certaine valeur, TypeScript va utiliser cette valeur en tant que type. |
| 21 | + |
| 22 | +```ts twoslash |
| 23 | +let helloWorld = "Hello World"; |
| 24 | +// ^? |
| 25 | +``` |
| 26 | + |
| 27 | +En comprenant comment JavaScript fonctionne, TypeScript peut créer un système qui accepte du code JavaScript, avec des types. Le résultat est un système de types qui n'a pas besoin de déclarations explicites de types dans votre code. C'est comme ça que TypeScript sait que `helloWorld` est un `string` dans l'exemple précédent (TypeScript a _inféré_ le type `string` de `helloWorld`). |
| 28 | + |
| 29 | +Il se peut que vous ayez écrit du JavaScript dans Visual Studio Code, et ayez obtenu de l'autocomplétion de la part de l'éditeur. Visual Studio Code utilise TypeScript en arrière-plan pour faciliter le travail avec JavaScript. |
| 30 | + |
| 31 | +## Définir des Types |
| 32 | + |
| 33 | +Vous pouvez utiliser une variété de design patterns en JavaScript. Cependant, certains patterns rendent difficile l'inférence automatique de types (par exemple, les patterns qui utilisent la programmation dynamique). Pour couvrir ces cas d'usage, TypeScript supporte une extension de JavaScript qui vous offre la possibilité de définir vos types. |
| 34 | + |
| 35 | +Par exemple, il est possible de créer un objet qui contient un `name: string` et un `id: number` en écrivant: |
| 36 | + |
| 37 | +```ts twoslash |
| 38 | +const user = { |
| 39 | + name: "Hayes", |
| 40 | + id: 0, |
| 41 | +}; |
| 42 | +``` |
| 43 | + |
| 44 | +Vous pouvez explicitement décrire la forme de cet objet en utilisant une déclaration d'`interface`: |
| 45 | + |
| 46 | +```ts twoslash |
| 47 | +interface User { |
| 48 | + name: string; |
| 49 | + id: number; |
| 50 | +} |
| 51 | +``` |
| 52 | + |
| 53 | +Vous pourrez déclarer que votre objet JavaScript respecte cette nouvelle `interface` en utilisant une syntaxe comme `: TypeName` après une déclaration de variable : |
| 54 | + |
| 55 | +```ts twoslash |
| 56 | +interface User { |
| 57 | + name: string; |
| 58 | + id: number; |
| 59 | +} |
| 60 | +// ---cut--- |
| 61 | +const user: User = { |
| 62 | + name: "Hayes", |
| 63 | + id: 0, |
| 64 | +}; |
| 65 | +``` |
| 66 | + |
| 67 | +TypeScript va vous prévenir si vous fournissez un objet qui ne correspond pas à votre interface : |
| 68 | + |
| 69 | +```ts twoslash |
| 70 | +// @errors: 2322 |
| 71 | +interface User { |
| 72 | + name: string; |
| 73 | + id: number; |
| 74 | +} |
| 75 | + |
| 76 | +const user: User = { |
| 77 | + username: "Hayes", |
| 78 | + id: 0, |
| 79 | +}; |
| 80 | +``` |
| 81 | + |
| 82 | +JavaScript (par conséquent, TypeScript) supporte les classes et la programmation orientée objet. Vous pouvez utiliser une déclaration d'interface avec une classe : |
| 83 | + |
| 84 | +```ts twoslash |
| 85 | +interface User { |
| 86 | + name: string; |
| 87 | + id: number; |
| 88 | +} |
| 89 | + |
| 90 | +class UserAccount { |
| 91 | + name: string; |
| 92 | + id: number; |
| 93 | + |
| 94 | + constructor(name: string, id: number) { |
| 95 | + this.name = name; |
| 96 | + this.id = id; |
| 97 | + } |
| 98 | +} |
| 99 | + |
| 100 | +const user: User = new UserAccount("Murphy", 1); |
| 101 | +``` |
| 102 | + |
| 103 | +Vous pouvez utiliser les interfaces pour annoter les types de paramètres et valeurs de retour de fonctions : |
| 104 | + |
| 105 | +```ts twoslash |
| 106 | +// @noErrors |
| 107 | +interface User { |
| 108 | + name: string; |
| 109 | + id: number; |
| 110 | +} |
| 111 | +// ---cut--- |
| 112 | +function getAdminUser(): User { |
| 113 | + //... |
| 114 | +} |
| 115 | + |
| 116 | +function deleteUser(user: User) { |
| 117 | + // ... |
| 118 | +} |
| 119 | +``` |
| 120 | + |
| 121 | +JavaScript fournit déjà un petit ensemble de types primitifs, dont vous pouvez vous servir dans une interface : `boolean`, `bigint`, `null`, `number`, `string`, `symbol`, et `undefined`. TypeScript étend cette liste en y ajoutant `any` (tout permettre), [`unknown`](/play#example/unknown-and-never) (s'assurer que quiconque se sert de ce type déclare le type voulu), [`never`](/play#example/unknown-and-never) (il est impossible d'avoir ce type), et `void` (une fonction qui retourne `undefined` ou ne retourne rien). |
| 122 | + |
| 123 | +Vous verrez deux syntaxes pour créer des types : [les Interfaces et les Types](/play/?e=83#example/types-vs-interfaces). Préférez une `interface`, mais utilisez un `type` si vous avez besoin d'une fonctionnalité particulière. |
| 124 | + |
| 125 | +## Composition de Types |
| 126 | + |
| 127 | +Avec TypeScript, il est possible de combiner plusieurs types simples en un type complexe. Deux manières populaires existent : les unions, et les types génériques. |
| 128 | + |
| 129 | +### Unions |
| 130 | + |
| 131 | +Une union vous permet de déclarer qu'un type pourrait en être un parmi certains. Par exemple, une façon de décrire le type `boolean` serait de dire qu'il est soit `true`, soit `false`: |
| 132 | + |
| 133 | +```ts twoslash |
| 134 | +type MyBool = true | false; |
| 135 | +``` |
| 136 | + |
| 137 | +_Note:_ Si vous survolez `MyBool`, vous verrez que le type est classé en tant que `boolean`. C'est une caractéristique du Système Structurel de Types (plus de détails ci-dessous). |
| 138 | + |
| 139 | +Un usage populaire des types union est de décrire les ensembles de `string` ou `number` acceptables en tant que valeurs : |
| 140 | + |
| 141 | +```ts twoslash |
| 142 | +type WindowStates = "open" | "closed" | "minimized"; |
| 143 | +type LockStates = "locked" | "unlocked"; |
| 144 | +type PositiveOddNumbersUnderTen = 1 | 3 | 5 | 7 | 9; |
| 145 | +``` |
| 146 | + |
| 147 | +Les unions fournissent également une manière de gérer les types hétérogènes. Par exemple, vous pouvez avoir une fonction qui accepte un `array` ou un `string` : |
| 148 | + |
| 149 | +```ts twoslash |
| 150 | +function getLength(obj: string | string[]) { |
| 151 | + return obj.length; |
| 152 | +} |
| 153 | +``` |
| 154 | + |
| 155 | +Pour connaître le type d'une variable, utilisez `typeof` : |
| 156 | + |
| 157 | +| Type | Condition | |
| 158 | +| --------- | ---------------------------------- | |
| 159 | +| string | `typeof s === "string"` | |
| 160 | +| number | `typeof n === "number"` | |
| 161 | +| boolean | `typeof b === "boolean"` | |
| 162 | +| undefined | `typeof undefined === "undefined"` | |
| 163 | +| function | `typeof f === "function"` | |
| 164 | +| array | `Array.isArray(a)` | |
| 165 | + |
| 166 | +Vous pouvez faire en sorte qu'une fonction retourne des valeurs différentes en fonction du type de l'argument passé : |
| 167 | + |
| 168 | +<!-- prettier-ignore --> |
| 169 | +```ts twoslash |
| 170 | +function wrapInArray(obj: string | string[]) { |
| 171 | + if (typeof obj === "string") { |
| 172 | + return [obj]; |
| 173 | +// ^? |
| 174 | + } |
| 175 | + return obj; |
| 176 | +} |
| 177 | +``` |
| 178 | + |
| 179 | +### Types Génériques |
| 180 | + |
| 181 | +Les types génériques fournissent des variables aux types. Les tableaux (arrays) seraient un exemple commun. Un tableau sans type générique pourrait tout contenir, alors qu'un tableau avec un type générique restreint son contenu à ce type générique. |
| 182 | + |
| 183 | +```ts |
| 184 | +type StringArray = Array<string>; |
| 185 | +type NumberArray = Array<number>; |
| 186 | +type ObjectWithNameArray = Array<{ name: string }>; |
| 187 | +``` |
| 188 | + |
| 189 | +Vous pouvez utiliser les types génériques avec vos propres types : |
| 190 | + |
| 191 | +```ts twoslash |
| 192 | +// @errors: 2345 |
| 193 | +interface Backpack<Type> { |
| 194 | + add: (obj: Type) => void; |
| 195 | + get: () => Type; |
| 196 | +} |
| 197 | + |
| 198 | +// Cette ligne est un raccourci pour informer TS de l'existence d'une |
| 199 | +// d'une constante appelée `backpack`, sans s'inquiéter d'où elle viendrait. |
| 200 | +declare const backpack: Backpack<string>; |
| 201 | + |
| 202 | +// object est un string, vu que nous avons déclaré un string |
| 203 | +// en tant que variable à `backpack`. |
| 204 | +const object = backpack.get(); |
| 205 | + |
| 206 | +// Vu que backpack est un string, vous ne pouvez pas donner de nombre |
| 207 | +// à la fonction add. |
| 208 | +backpack.add(23); |
| 209 | +``` |
| 210 | + |
| 211 | +## Système Structurel de Types |
| 212 | + |
| 213 | +L'un des principes au cœur de TypeScript est que la vérification des types se concentre sur la _forme_ de la valeur. Ce principe est parfois appelé "typage structurel". |
| 214 | + |
| 215 | +Dans un système structurel, si deux objets ont la même forme (la même structure, d'où le nom), ils sont considérés comme étant du même type. |
| 216 | + |
| 217 | +```ts twoslash |
| 218 | +interface Point { |
| 219 | + x: number; |
| 220 | + y: number; |
| 221 | +} |
| 222 | + |
| 223 | +function logPoint(p: Point) { |
| 224 | + console.log(`${p.x}, ${p.y}`); |
| 225 | +} |
| 226 | + |
| 227 | +// affiche "12, 26" |
| 228 | +const point = { x: 12, y: 26 }; |
| 229 | +logPoint(point); |
| 230 | +``` |
| 231 | + |
| 232 | +La variable `point` n'a jamais été déclarée en tant que `Point`. Mais TypeScript compare la forme de `point` la variable à la forme de `Point` l'interface. Les deux ont la même forme, donc l'appel est validé. |
| 233 | + |
| 234 | +La correspondance entre formes requiert uniquement la correspondance d'un sous-ensemble des propriétés d'un objet. |
| 235 | + |
| 236 | +```ts twoslash |
| 237 | +// @errors: 2345 |
| 238 | +interface Point { |
| 239 | + x: number; |
| 240 | + y: number; |
| 241 | +} |
| 242 | + |
| 243 | +function logPoint(p: Point) { |
| 244 | + console.log(`${p.x}, ${p.y}`); |
| 245 | +} |
| 246 | +// ---cut--- |
| 247 | +const point3 = { x: 12, y: 26, z: 89 }; |
| 248 | +logPoint(point3); // affiche "12, 26" |
| 249 | + |
| 250 | +const rect = { x: 33, y: 3, width: 30, height: 80 }; |
| 251 | +logPoint(rect); // affiche "33, 3" |
| 252 | + |
| 253 | +const color = { hex: "#187ABF" }; |
| 254 | +logPoint(color); |
| 255 | +``` |
| 256 | + |
| 257 | +Il n'y a aucune différence entre la façon dont les classes et les objets se conforment aux formes : |
| 258 | + |
| 259 | +```ts twoslash |
| 260 | +// @errors: 2345 |
| 261 | +interface Point { |
| 262 | + x: number; |
| 263 | + y: number; |
| 264 | +} |
| 265 | + |
| 266 | +function logPoint(p: Point) { |
| 267 | + console.log(`${p.x}, ${p.y}`); |
| 268 | +} |
| 269 | +// ---cut--- |
| 270 | +class VirtualPoint { |
| 271 | + x: number; |
| 272 | + y: number; |
| 273 | + |
| 274 | + constructor(x: number, y: number) { |
| 275 | + this.x = x; |
| 276 | + this.y = y; |
| 277 | + } |
| 278 | +} |
| 279 | + |
| 280 | +const newVPoint = new VirtualPoint(13, 56); |
| 281 | +logPoint(newVPoint); // affiche "13, 56" |
| 282 | +``` |
| 283 | + |
| 284 | +Si un objet ou une classe possède toutes les propriétés requises, TypeScript dira que la variable correspond, peu importe les détails d'implémentation. |
| 285 | + |
| 286 | +## Prochaines étapes |
| 287 | + |
| 288 | +C'était un bref résumé de la syntaxe et des outils régulièrement utilisés en TypeScript. À partir de là, vous pourrez : |
| 289 | + |
| 290 | +- Lire le Manuel [du début à la fin](/docs/handbook/intro.html) (30m) |
| 291 | +- Explorer les [exemples du bac à sable](/play#show-examples) |
0 commit comments