Manipulez la syntaxe de TypeScript

Ajoutez des types Ă  votre JavaScript

Pour pouvoir Ă©crire en TypeScript, il nous faut crĂ©er un fichier
 TypeScript !

Si les fichiers JavaScript ont pour extension .js, c’est tout aussi simple pour les fichiers TypeScript : leur extension est .ts ! Plutît intuitif, n’est-ce pas ?

Si vous avez suivi le chapitre prĂ©cĂ©dent, vous devriez dĂ©jĂ  avoir un fichier my-file.ts. Si ce n’est pas le cas, ce n’est pas grave : nous allons de toute façon effacer son contenu pour repartir de zĂ©ro, alors crĂ©ez simplement un nouveau fichier !

Je vous demanderai donc de copier-coller le code JavaScript ci-dessous dans votre fichier .ts :

function addition(x, y) {
    return x + y;
}
const result = addition('10', '20');
console.log(result);

Ici, nous avons donc du code JavaScript assez classique : une fonction addition  qui fait la somme de deux nombres. Si vous essayez de compiler ce code (via la commande  npx tsc my-file.ts   ), vous verrez que le fichier JavaScript généré est pour ainsi dire identique :

function addition(x, y) {
    return x + y;
}
var result = addition('10', '20');
console.log(result);

En gros, seul le mot-clé const  a été remplacé par var  .

Et si je veux garder const  ?

Vous pouvez changer ce comportement via l’option --target  : npx tsc my-file.ts --target es6  . Vous pouvez en savoir plus dans la documentation officielle, mais je vous invite Ă  ne pas vous attarder sur ce genre de dĂ©tail pour le moment !

Si vous en doutiez encore, voici donc la preuve qu’un code JavaScript basique est du code TypeScript fonctionnel : le compilateur a tout compris et a gĂ©nĂ©rĂ© le JavaScript sans aucun souci !

Bon, et si on ajoutait enfin des types à notre fonction addition  ? Vraisemblablement, nous souhaitons qu’elle n’accepte que des nombres en tant que paramùtres. Pour ce faire, nous ajoutons la syntaxe :number  à droite de ces paramùtres :

function addition(x: number, y: number) {
    return x + y;
}
const result = addition('10', '20');
console.log(result);

ArrĂȘtons-nous quelques secondes sur cette nouvelle syntaxe.

Pour indiquer un type, la syntaxe principale est le caractĂšre :   suivi du type en question. L’espace aprĂšs  :   est optionnel, vous n’ĂȘtes pas obligĂ© de le mettre.

Une ligne de code montre la syntaxe de base. On commence par le mot-clé let, puis le nom de la variable suivi du caractÚre deux points. AprÚs vient le type de la variable, number par exemple. Enfin on ajoute le signe égal et la valeur de la variable.

Pour commencer, retenez que TypeScript propose ces trois types basiques (appelés aussi types primitifs) :

  1. number  (pour les nombres).

  2. string  (pour les chaßnes de caractÚres).

  3. Et boolean  (pour les valeurs true  et false  ). 

Juste en ajoutant ces  : number   à droite de nos paramùtres, TypeScript sait que notre fonction addition  s’attend à recevoir des nombres.

Il est Ă©galement possible de dĂ©finir le type de la valeur retournĂ©e par la fonction : pour ce faire, il suffit de rĂ©utiliser ce fameux  : number   aprĂšs la liste des paramĂštres, juste avant l’accolade ouvrante :

function addition(x: number, y: number):number {
    return x + y;
}
const result = addition('10', '20');
console.log(result);

GrĂące Ă  cette indication du type de retour, TypeScript sait que result  est forcĂ©ment un nombre. On peut cela dit ĂȘtre plus explicite en l’indiquant clairement. Comment ? Eh bien, toujours grĂące Ă  la fameuse annotation :number  !

function addition(x: number, y: number): number {
    return x + y;
}
const result:number = addition('10', '20');
console.log(result);

C’est terminĂ© : notre petit code JavaScript est dĂ©sormais devenu un joli code typĂ© avec TypeScript. Ce n’était pas si difficile, pas vrai ?
Tentons maintenant de compiler le code (pour rappel, via la commande  npx tsc my-file.ts   ) :

La compilation ne fonctionne plus ! On a tout cassĂ© ! đŸ˜±

Rassurez-vous, c’était totalement prĂ©vu ! Car ceci permet de faire la transition parfaite vers notre prochaine section : comment lire, comprendre et corriger cette erreur remontĂ©e par TypeScript ?

Découvrez comment TypeScript remonte les erreurs

L’une des compĂ©tences essentielles lorsqu’on dĂ©veloppe en TypeScript est de comprendre ce qu’essaie de nous dire le langage. Il nous crie dessus, ça ne fait pas plaisir, c’est vrai
 Mais essayons d’analyser ce qui l’embĂȘte dans notre code. Je remets ici l’erreur qu’il nous remonte :

Au bas de l'écran, TypeScript indique qu'il a trouvé une erreur dans le code.

Lorsqu’on essaie de compiler ce code, l’erreur qui en rĂ©sulte commence ainsi  :

> my-file.ts:4:32

TypeScript nous indique le nom du fichier qui concerne l’erreur, puis le numĂ©ro de la ligne impactĂ©e, ainsi que la colonne. Juste avec ce dĂ©but d’information, nous apprenons donc que l’erreur se trouve dans le fichier my-file.ts (ça on pouvait le deviner nous-mĂȘme 😬). GrĂące Ă  l’indication  4:32  , on sait que le problĂšme survient au niveau de la ligne 4, et encore plus prĂ©cisĂ©ment Ă  partir du 32e caractĂšre de cette ligne :

La capture d'écran fait un zoom à l'endroit de l'erreur relevée par TypeScript, autrement dit à la ligne 4, caractÚre 32.

On peut donc en dĂ©duire que TypeScript n’aime pas le '10'  . Mais pourquoi ? Continuons la lecture de l’erreur :

> - error TS2345

Ici, TypeScript nous confirme qu’il s’agit d’une vĂ©ritable erreur (on aurait pu avoir une simple alerte), et il prĂ©cise cette Ă©trange valeur : TS2345. Que cette suite de lettres et de chiffres ne vous fasse pas peur, il s’agit simplement d’un code d’erreur. Un code de ce genre est associĂ© Ă  chaque erreur que peut remonter TypeScript, ce qui permet de facilement les identifier. Cela simplifie la recherche d’informations et la communication entre les dĂ©veloppeurs.

Attends
 Ça veut dire que je dois connaütre tous les codes possibles?! 😹

Heureusement que non ! Cela serait mĂȘme totalement inutile, puisque TypeScript ajoute une description plus dĂ©taillĂ©e de l’erreur, juste aprĂšs ce code :

> Argument of type 'string' is not assignable to parameter of type 'number'.

Ici, le message d’erreur indique que nous envoyons une string (une chaĂźne de caractĂšres) alors que le paramĂštre s’attend Ă  recevoir un nombre (comme on l’a dĂ©fini ensemble). La solution est donc d’enlever les apostrophes autour des nombres que l’on envoie Ă  la fonction addition  , afin de lui envoyer de vĂ©ritables nombres, et non plus des strings :

function addition(x: number, y: number): number {
    return x + y;
}
const result:number = addition(10, 20);
console.log(result);

Lancez Ă  nouveau une compilation : tout devrait ĂȘtre dĂ©sormais rentrĂ© dans l’ordre ! Et si vous ouvrez le fichier my-file.js gĂ©nĂ©rĂ©, vous pouvez constater que le JavaScript Ă©crit n’a pas changĂ©. Preuve une fois de plus que TypeScript n’est lĂ  que pour vous aiguiller durant le dĂ©veloppement (quitte Ă  vous disputer un petit peu !).

L’erreur remontĂ©e ici par TypeScript Ă©tait assez claire Ă  comprendre, mais je dois vous avouer quelque chose : lorsque le code est plus compliquĂ©, il est possible que les messages de l’outil soient un peu plus cryptiques Ă  comprendre.

Typez des objets

Jusque-là, notre exemple est plutÎt simple, car notre fonction ne manipule que des nombres. Essayons de complexifier tout ça !

Pour ce faire, nous allons une fonction qui vise à endommager un personnage de jeu vidéo. Voyons tout cela en vidéo et ensuite vous trouverez le récapitulatif de la manipulation :

Allez on récapitule ? C'est parti !

Cette fonction prend en premier paramÚtre le personnage à blesser, et en deuxiÚme paramÚtre le total de blessures. Sa valeur de retour est le nouveau total de points de vie du personnage :

function damage(characterToDamage, amount: number): number {
    characterToDamage.life -= amount;
    return characterToDamage.life;
}
const result = damage({ life: 100 }, 12);
console.log(result);

Dans cet exemple,  characterToDamage  n’a pas encore de type : comment faire pour le typer correctement ?

Ce paramĂštre est utilisĂ© comme un objet : on essaie en effet de manipuler sa propriĂ©té life  via characterToDamage.life  . Pour dĂ©finir qu’une variable est un objet, TypeScript utilise la mĂȘme syntaxe que JavaScript, Ă  savoir des accolades :

function damage(characterToDamage: {}, amount: number): number {```

Juste en appliquant ce changement, TypeScript nous signale cette erreur :

> Property 'life' does not exist on type '{}'.

Comme on vient de le voir, on essaye de manipuler la propriété life  , mais TypeScript ne sait pas encore que characterToDamage  la possÚde : il faut donc le lui dire !

function damage(characterToDamage: { life: number }, amount: number): number {```

Et c’est tout ! Le code complet devient donc :

function damage(characterToDamage: { life: number }, amount: number): number {
    characterToDamage.life -= amount;
    return characterToDamage.life;
}
const result = damage({ life: 100 }, 12);
console.log(result);

Amusez-vous Ă  modifier l’appel Ă  la fonction damage  en envoyant des arguments erronĂ©s. Essayez par exemple  damage({ life: 'douze' }, 12)   ,  damage({ vie: 100 }, 12)   , ou encore  damage({ life: 100, magic: 20 }, 12)   : TypeScript rĂ©agit Ă  chaque fois en vous alertant sur les erreurs qu’il dĂ©tecte. PlutĂŽt sympa d’avoir un outil qui nous prĂ©vient de la sorte, non ? 😎

À vous de jouer !

Voici un petit exercice concret pour vous faire manipuler un peu TypeScript.

Votre mission, si vous l’acceptez, est de modifier le code ci-dessous afin de corriger toutes les erreurs qu’il contient.

// Ne modifiez que le typage TypeScript, ne touchez pas au code JavaScript !

function sayHello(target: { firstName: string, money: true }): number {
    return `Hello ${target.firstname}, you have ${target.money} on your bank account.`;
}
const message: boolean = sayHello({ firstname: 'World', money: 123 });

En résumé

  • Pour indiquer des types basiques Ă  nos variables, on utilise la syntaxe  :   + le nom du type en minuscules.

  • TypeScript retourne des messages d’erreurs qui se veulent ĂȘtre le plus prĂ©cis possible.

  • La syntaxe pour dĂ©clarer le type d’un objet est trĂšs proche de celle de JavaScript.

Nous avons donc ajoutĂ© des types dans notre code, nous avons mĂȘme vu comment typer des paramĂštres plus complexes, comme les objets : et si nous allions encore plus loin en crĂ©ant nos propres types rien qu’à nous ?

Ever considered an OpenClassrooms diploma?
  • Up to 100% of your training program funded
  • Flexible start date
  • Career-focused projects
  • Individual mentoring
Find the training program and funding option that suits you best