Introduction Ă TypeScript
TypeScript
est un langage de programmation qui s’appuie sur JavaScript
, tout en ajoutant des fonctionnalités comme les types statiques, qui permet notamment à savoir à l’avance dans notre IDE si notre code est correct et s’éxecutera bien. C’est un langage qui rend JavaScript
plus robuste, lisible et permet aux développeurs de coder avec plus de sécurité en évitant certaines erreurs courantes. Il est de plus en plus utilisé dans le développement d’applications web modernes pour sa capacité à améliorer la qualité et la maintenabilité du code.
Qui a créé TypeScript ?
TypeScript
a été créé par Microsoft en 2012, sous la direction de Anders Hejlsberg, un ingénieur en chef renommé qui est aussi le principal créateur du C# et d’autres encore. L’idée était d’améliorer les outils de développement pour les projets JavaScript
à grande échelle.
Pourquoi TypeScript a été créé ?
TypeScript
a été conçu pour combler certaines lacunes de JavaScript
, notamment le manque de types statiques. Dans des projets de grande envergure, l’absence de typage peut rendre la maintenance et la gestion des erreurs très difficiles. TypeScript
permet aux développeurs d’ajouter des types à leur code JavaScript
, ce qui améliore la lisibilité, la détection des erreurs et la collaboration au sein des équipes de développement. En d’autres termes, TypeScript
est une évolution de JavaScript
qui facilite la gestion des projet.
Comment fonctionne TypeScript ?
TypeScript
fonctionne en tant que sur-ensemble de JavaScript
. Cela signifie que tout code JavaScript
valide est également du code TypeScript
valide. Cependant, TypeScript
ajoute des fonctionnalités supplémentaires, comme le typage statique et les interfaces. Lorsque l’on écrit du code TypeScript
, il est ensuite transpilé en JavaScript
standard pour pouvoir être exécuté dans un navigateur ou un environnement comme Node.js. Cela permet d’avoir les avantages de TypeScript
tout en restant compatible avec l’écosystème JavaScript
.
Qu’est-ce que le duck typing en TypeScript ?
Le duck typing est un concept issu du monde du typage dynamique. Il se résume à l’idée que “si quelque chose marche comme un canard et mange comme un canard, alors c’est probablement un canard”. En TypeScript
, cela signifie qu’un objet peut être utilisé dans un certain contexte si sa forme correspond à ce qui est attendu, indépendamment de son instance. Par exemple, si on a une fonction qui demande en paramètre un objet Chien
ayant une fonction manger()
et qu’on donne à cette fonction un objet Chat
qui possède une fonction manger()
également, alors TypeScript
n’y verra aucun inconvéniant à accepter ce genre d’opération et le code s’éxecutera sans problème, le tout est d’avoir un objet équivalent qui possède les mêmes propriétés et fonction qui l’objet demandé.
class Chien {
manger(): string {
return "Je mange!";
}
}
class Chat {
manger(): string {
return "Je mange!";
}
}
class Hamster {
boire(): string {
return "Je bois!";
}
}
const chien = new Chien();
const chat = new Chat();
const hamster = new Hamster();
function action(chien: Chien): string {
return chien.manger();
}
console.log(action(chien)) // âś”
console.log(action(chat)) // âś”
console.log(action(hamster)) // ✖ Hamster n'a pas de fonction manger() alors `TypeScript` interdit l'opération
La théorie des ensembles en TypeScript
La théorie des ensembles en TypeScript
se reflète dans la manière dont les types sont traités. Les types en TypeScript
peuvent ĂŞtre vus comme des ensembles de valeurs possibles. Par exemple, un type string est un ensemble qui contient toutes les valeurs literal. TypeScript
permet d’effectuer des opérations sur ces ensembles via des unions |
et des intersections &
.
type A = "hello world";
type checkA = A extends string ? true : false // checkA = true
// "hello world" fait bien parti de l'ensemble string
type checkString = string extends A ? true : false // checkString = false
// string ne fait pas parti de "hello world" car c'est un type literal
L’opérateur keyof
L’opérateur keyof en TypeScript
permet de récupérer les clés (ou propriétés) d’un objet sous forme de type. Imaginons un objet Chien
qui a les propriétés nom
et race
. On peut utiliser l’opérateur keyof
afin de récupérer les propriétés de l’objet voulu, ici Chien
par exemple.
class Chien {
nom: string;
race: string;
}
function afficherValeur(chien: Chien, clé: keyof Chien) {
return chien[clé];
}
const chien = { nom: "Toto", race: "Bulldog" };
console.log(afficherValeur(chien, "nom")); // âś”
console.log(afficherValeur(chien, "titi")); // ✖ TypeScript va surligner en rouge "titi" car la classe Chien ne possède pas de propriété "titi"
L’opérateur satisfies
L’opérateur satisfies est un concept qui permet de donner un contrat à TypeScript
afin de vérifier que se contrat soit bien respecté, tout en laissant plus de flexibilité. C’est utile lorsque qu’on veut être sûr que notre variable correspond à un type spécifique sans restreindre l’utilisation de cette variable. Cela permet d’avoir des types plus complexes tout en gardant la liberté de définir des valeurs précises.
type HexaColor = `#${string}`
const colorInfered = "#00000" satisfies HexaColor; // type #00000
const colorContract: HexaColor = "#00000"; // type #${string}
type StatusLabel = Record<string, string>
const labelsInfered = {
admin: "toto",
modo: "toto",
user: "toto",
} satisfies StatusLabel
type labelsInferedKeys = keyof typeof labelsInfered // type "admin" | "modo" | "user"
const labelsContract: StatusLabel = {
admin: "toto",
modo: "toto",
user: "toto",
}
type labelsContractKeys = keyof typeof labelsContract // type string