Skip to content

Commit 03f503b

Browse files
Merge pull request #114 from nfabredev/translate-fr-playground-3-7-syntax-and-messaging
Translate FR: playground/fr/3-7/Syntax and messaging
2 parents 9f6901c + 993fee5 commit 03f503b

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//// { compiler: { }, order: 3 }
2+
3+
// Les messages d'erreur TypeScript peuvent être un peu verbeux...
4+
// Avec la version 3.7, nous avons corrigé quelques cas qui
5+
// généraient des messages d'erreurs très longs.
6+
7+
// Propriétés imbriquées
8+
9+
let a = { b: { c: { d: { e: "string" } } } };
10+
let b = { b: { c: { d: { e: 12 } } } };
11+
12+
a = b;
13+
14+
// Auparavant, c'était deux lignes de code par propriété imbriquée, ce qui
15+
// a rapidement amené les gens à lire
16+
// uniquement la première et dernière ligne des messages d'erreur.
17+
18+
// Maintenant elles sont en ligne. :tada:
19+
20+
// Auparavant avec la version 3.6:
21+
//
22+
// Type '{ b: { c: { d: { e: number; }; }; }; }' is not assignable to type '{ b: { c: { d: { e: string; }; }; }; }'.
23+
// Types of property 'b' are incompatible.
24+
// Type '{ c: { d: { e: number; }; }; }' is not assignable to type '{ c: { d: { e: string; }; }; }'.
25+
// Types of property 'c' are incompatible.
26+
// Type '{ d: { e: number; }; }' is not assignable to type '{ d: { e: string; }; }'.
27+
// Types of property 'd' are incompatible.
28+
// Type '{ e: number; }' is not assignable to type '{ e: string; }'.
29+
// Types of property 'e' are incompatible.
30+
// Type 'number' is not assignable to type 'string'
31+
32+
// Ça peut aussi marcher avec des objets de types différents
33+
// et toujours donner un message d'erreur utile et concis.
34+
35+
class ExampleClass {
36+
state = "ok";
37+
}
38+
39+
class OtherClass {
40+
state = 12;
41+
}
42+
43+
let x = { a: { b: { c: { d: { e: { f: ExampleClass } } } } } };
44+
let y = { a: { b: { c: { d: { e: { f: OtherClass } } } } } };
45+
x = y;
46+
47+
// Auparavant avec la version 3.6:
48+
//
49+
// Type '{ a: { b: { c: { d: { e: { f: typeof OtherClass; }; }; }; }; }; }' is not assignable to type '{ a: { b: { c: { d: { e: { f: typeof ExampleClass; }; }; }; }; }; }'.
50+
// Types of property 'a' are incompatible.
51+
// Type '{ b: { c: { d: { e: { f: typeof OtherClass; }; }; }; }; }' is not assignable to type '{ b: { c: { d: { e: { f: typeof ExampleClass; }; }; }; }; }'.
52+
// Types of property 'b' are incompatible.
53+
// Type '{ c: { d: { e: { f: typeof OtherClass; }; }; }; }' is not assignable to type '{ c: { d: { e: { f: typeof ExampleClass; }; }; }; }'.
54+
// Types of property 'c' are incompatible.
55+
// Type '{ d: { e: { f: typeof OtherClass; }; }; }' is not assignable to type '{ d: { e: { f: typeof ExampleClass; }; }; }'.
56+
// Types of property 'd' are incompatible.
57+
// Type '{ e: { f: typeof OtherClass; }; }' is not assignable to type '{ e: { f: typeof ExampleClass; }; }'.
58+
// Types of property 'e' are incompatible.
59+
// Type '{ f: typeof OtherClass; }' is not assignable to type '{ f: typeof ExampleClass; }'.
60+
// Types of property 'f' are incompatible.
61+
// Type 'typeof OtherClass' is not assignable to type 'typeof ExampleClass'.
62+
// Type 'OtherClass' is not assignable to type 'ExampleClass'.
63+
// Types of property 'state' are incompatible.
64+
// Type 'number' is not assignable to type 'string'
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// { compiler: { }, order: 2 }
2+
3+
// L'opérateur de coalescence des nuls (nullish coalescing operator) est une
4+
// alternative à || qui retourne l'expression de droite si celle de gauche
5+
// est nulle ou non-définie.
6+
7+
// En revanche, || vérifie si la valeur est de type fausse (falsy), ce qui veut dire
8+
// qu'une chaîne de caractères, ou le nombre 0, seraient considérés faux.
9+
10+
// Un bon example est la gestion des objets partiellement
11+
// définis, pour lesquels il est possible d'avoir des valeurs par défaut
12+
// quand une clef est manquante.
13+
14+
interface AppConfiguration {
15+
// Défaut: "(no name)"; une chaîne de caractère vide est une valeur valide
16+
name: string;
17+
18+
// Défaut: -1; 0 est une valeur valide
19+
items: number;
20+
21+
// Défaut: true
22+
active: boolean;
23+
}
24+
25+
function updateApp(config: Partial<AppConfiguration>) {
26+
// Avec l'opérateur de coalescence des nuls
27+
config.name = config.name ?? "(no name)";
28+
config.items = config.items ?? -1;
29+
config.active = config.active ?? true;
30+
31+
// Sans l'opérateur de coalescence des nuls
32+
config.name = typeof config.name === "string" ? config.name : "(no name)";
33+
config.items = typeof config.items === "number" ? config.items : -1;
34+
config.active = typeof config.active === "boolean" ? config.active : true;
35+
36+
// L'opérateur || pourrait retourner des valeurs incorrectes
37+
config.name = config.name || "(no name)"; // empêche de passer "" comme valeur
38+
config.items = config.items || -1; // empêche de passer 0 comme valeur
39+
config.active = config.active || true; // incorrect, sera toujours true
40+
}
41+
42+
// Plus de détails sur l'opérateur de coalescence des nuls dans la version 3.7
43+
// sur le blog:
44+
//
45+
// https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//// { compiler: { }, order: 1 }
2+
3+
// Le chaînage optionnel a atteint l'étape 3 du TC39 pendant le development
4+
// de la version 3.7. Le chaînage optionnel permet d'écrire du code qui va
5+
// interrompre l'execution des expressions dès qu'il atteint une valeur
6+
// null ou undefined.
7+
8+
// Accès aux propriétés d'un objet
9+
10+
// Imaginons que nous ayons un album où l'artiste, et sa bio, puissent ne pas
11+
// être present dans les données. Par exemple, une compilation pourrait n'aurait pas un seul artiste.
12+
13+
type AlbumAPIResponse = {
14+
title: string;
15+
artist?: {
16+
name: string;
17+
bio?: string;
18+
previousAlbums?: string[];
19+
};
20+
};
21+
22+
declare const album: AlbumAPIResponse;
23+
24+
// Avec le chaînage optionnel,
25+
// vous pouvez écrire le code suivant:
26+
27+
const artistBio = album?.artist?.bio;
28+
29+
// A la place de:
30+
31+
const maybeArtistBio = album.artist && album.artist.bio;
32+
33+
// Dans ce cas ?. agit différemment que le ET logique (&&) car ce dernier traite
34+
// les valeur fausses (e.g. une chaîne de caractères vide, 0, Nan et false) de
35+
// façon différente.
36+
37+
// Le chaînage optionnel va seulement arrêter l'évaluation et retourner undefined
38+
// si la valeur est null ou undefined.
39+
40+
// Accès à un élément optionnel
41+
42+
// Acceder à une propriété se fait avec l'opérateur ., et le chaînage optionnel
43+
// marche aussi avec l'opérateur [] pour acceder à des éléments.
44+
45+
const maybeArtistBioElement = album?.["artist"]?.["bio"];
46+
47+
const maybeFirstPreviousAlbum = album?.artist?.previousAlbums?.[0];
48+
49+
// Appel optionnel
50+
51+
// Quand il s'agit d'appeler des fonctions qui peuvent être définies ou non définies,
52+
// le chaînage optionnel permet d'appeler la fonction uniquement si elle existe.
53+
// Cela peut remplacer le code où l'on écrirait traditionnellement quelque chose comme:
54+
// if (func) func()
55+
56+
// Par example le chaînage optionnel pour appeler un callback après une requête
57+
// vers une API:
58+
59+
const callUpdateMetadata = (metadata: any) => Promise.resolve(metadata); // Fake API call
60+
61+
const updateAlbumMetadata = async (metadata: any, callback?: () => void) => {
62+
await callUpdateMetadata(metadata);
63+
64+
callback?.();
65+
};
66+
67+
// Plus de détails sur le chaînage optionnel dans la version 3.7 sur le blog:
68+
//
69+
// https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/

0 commit comments

Comments
 (0)