Contrôle d'accès dans les classes Typescript
De nombreux langages de programmation définissent les propriétés de ses classes comme privées par défaut. Pour les rendre accessibles depuis l'extérieur de l'instance, vous devez généralement marquer les propriétés pertinentes avec le mot-clé « public ».
Le même mot-clé est également disponible dans les classes Typescript, mais n'a pas beaucoup d'impact, car les propriétés des classes Typescript sont publiques par défaut. Cette contrainte est héritée de Javascript, qui ne prend pas en charge les propriétés privées dans les classes. Eh bien, jusqu'à récemment.
Champs privés en Javascript ?
Oui et non. Actuellement, un brouillon de travail pour une spécification qui définit les propriétés privées dans les classes Javascript est à l'étape 3, ce qui indique qu'une définition finale est plausible, mais pas encore sûre.
Les changements proposés dans la spécification sont vraiment simples et ne modifient que légèrement la syntaxe. Pour marquer une propriété comme privée, il suffit de la préfixer avec un hashtag. C'est ça!
class User {
// A prop marked as private.
#id;
age;
constructor(age){
this.age = age;
// Valid assignment, as we're
// within the class.
this.#id = Math.floor(Math.random() * 1000);
}
}
// ... Later in the code ...
const user = new User(42);
// Error! Won't work as it's private.
user.#id = 123;
Champs privés dans Typescript!
La même syntaxe s'applique pour les propriétés privées dans Typescript. Depuis la version 3.8, vous pouvez utiliser cette fonctionnalité pour mieux contrôler l'accès aux propriétés et fonctions des instances ainsi que des champs statiques. La syntaxe est la même que dans l'exemple Javascript.
Un instant s'il vous plaît, champs statiques privés ?
Oui, vous avez bien lu : les variables statiques ainsi que les fonctions peuvent également être privées, ce qui signifie qu'elles ne peuvent être appelées qu'à l'intérieur des membres de la classe. Cette fonctionnalité a été ajoutée avec Typescript version 4.3, ainsi que d'autres modifications sous le capot. Selon la documentation de la version 4.3, les membres de la classe privée sont désormais vraiment privés au moment de l'exécution, ce qui indique que cette fonctionnalité a complètement mûri.
Veuillez noter que Typescript prend en charge deux variantes différentes de "privé" pour les classes. Le plus connu est avec le mot-clé "private", qui maintient les champs marqués inaccessibles même à partir des classes dérivées.
L'autre caractéristique, qui est celle que je montre ici et qui est nouvelle, est l'utilisation de soi-disant "noms privés". C'est la même syntaxe que pour Javascript, car leur spécification a été définie à l'origine par JS. Dans Typescript, ils contrôlent l'accès pendant l'exécution.
/**
* A class that uses already known
* private props.
*/
class CommonUser {
// Common 'private' prop in TS.
private id: number;
age: number;
constructor(age: number){
this.age = age;
this.id = Math.floor(Math.random() * 1000);
}
}
/**
* Using the new sytanx for private class names.
*/
class SpecialUser {
#id: number;
age: number;
constructor(age: number){
this.age = age;
// Valid, we're inside the class.
this.#id = SpecialUser.#generateId();
}
static #generateId(){
return Math.floor(Math.random() * 1000);
}
#stringifyId(){
return this.#id.toString();
}
}
// ... Later in the code ...
// Invalid, call is outside of class 'SpecialUser'.
SpecialUser.#generateId();
const user = new SpecialUser(42);
// And that won't work as well.
user.#stringifyId();
Derniers mots pour le dernier chapitre
Cet article n'est pas très long mais met en évidence une fonctionnalité intéressante que Typescript offre maintenant ainsi qu'un avantage plus général de Typescript lui-même. Pour Javascript, les propriétés privées sont encore à l'état de brouillon (bien qu'à un stade très avancé), mais pour Typescript, elles sont déjà implémentées et livrées, ce qui montre la vitesse à laquelle ce langage évolue !