Interfaces
Imaginons que nous développons un jeu vidéo et que nous devions détecter s'il y a une collision entre deux joueurs. Dans le but de simplifier, nous assumerons que les joueurs ne sont définis que par des points ayant des coordonnées x, y et z.
Une façon simple serait de définir une fonction et de passer en argument les coordonnées des deux positions.
let collisionJoueurs = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {
if (x1 == x2 && y1 == y2 && z1 == z2)
return true;
return false;
}
console.log(collisionJoueurs(2, 2, 1, 3, 3, 1)); // pas de collision
Note n'étant pas reliée à TypeScript: nous n'avons pas à écrire un else
pour la condition. false
est la valeur par défaut et si jamais la condition est vraie, c'est ce qui sera retourné.
Anciennement, il ne s'agissait pas d'une pratique populaire (early return) puisque la désallocation de la mémoire pouvait se faire à la fin de la fonction. Ainsi, retourner avant la fin de la fonction pouvait mener à garder en mémoire des références inutiles. En JavaScript, et dans plusieurs autres langages modernes, ce n'est pas tellement un enjeu.
On peut simplifier encore plus de la façon suivante...
let collisionJoueurs = (x1: number, y1: number, z1: number, x2: number, y2: number, z2: number) => {
return x1 == x2 && y1 == y2 && z1 == z2;
}
console.log(collisionJoueurs(2, 2, 1, 3, 3, 1)); // pas de collision
Cette solution est fonctionnelle, mais n'est pas élégante et peu flexible au niveau du constructeur. De plus, il y a de la répétition évidente dans les noms des arguments et l'appel de la fonction n'est pas très descriptif.
Nous pouvons définir une interface afin de définir ce qu'est une position., c'est-à-dire un "contrat" sur les attributs que l'objet doit au minimum avoir.
interface Position {
x: number,
y: number,
z: number,
}
let collisionJoueurs = (p1: Position, p2: Position) => {
return p1.x == p2.x && p1.y == p2.y && p1.z == p2.z
}
let p1: Position = { x: 2, y: 2, z: 1 };
let p2: Position = { x: 3, y: 3, z: 1 };
console.log(collisionJoueurs(p1, p2));
Cela simplifie grandement notre définition de fonction et nous permet de réutiliser le type Position
.