Comment créer une classe "final" avec TypeScript ?

author
Andréas Hanss · Oct 26, 2022
dev | 1 min
Article image

Pourquoi pourrais-je utiliser une classe non extensible pour ? (alias une classe finale)

Lorsque l'on sait, par conception, que notre classe n'est pas faite pour être héritée par une classe fille, c'est une bonne pratique de la rendre finale; cela renforce l'idée d'une meilleure conception logicielle.

Dans plusieurs langages, il est possible de créer une classe mère qui ne peut pas être étendue par une classe fille en utilisant un simple mot-clé final ou sealed.

Malheureusement, il n'est pas possible - au moment de la rédaction de cet article - de créer une classe finale avec JavaScript/TypeScript.

Une astuce simple pour créer une classe finale avec JavaScript/TypeScript !

Mais il est possible de « tromper » le système en exploitant les annotations et obtenir un comportement similaire de cette manière.

1
/**
2
* Make the following class unable to be extended.
3
*
4
* @param target
5
* @returns The new class
6
*/
7
export function final<T extends { new (...args: any[]): object }>(target: T): T {
8
return class Final extends target {
9
constructor(...args: any[]) {
10
if (new.target !== Final) throw new Error(`Cannot extend a final class "${target.name}"`);
11
super(...args);
12
}
13
};
14
}

Comme nous l'avons dit plus haut, ce code est conçu pour être utilisé comme avec un décorateur, qui est une proposition de niveau 2 pour JavaScript.

Dans un projet TypeScript, on peut d'ores-et-déjà déjà utiliser cette fonctionnalité en l'activant dans son tsconfig.json.

Pour en savoir plus sur les décorateurs on peut se rendre dans la documentation de Typescript.

Exemple d'usage :

Exemple