Voici une approche réutilisable pour ajouter des propriétés privées appropriées :
/**
* Implements proper private properties.
*/
export class Private<K extends object, V> {
private propMap = new WeakMap<K, V>();
get(obj: K): V {
return this.propMap.get(obj)!;
}
set(obj: K, val: V) {
this.propMap.set(obj, val);
}
}
Disons que vous avez une classe Client
quelque part qui a besoin de deux propriétés privées :
prop1: string
prop2: number
Voici comment le mettre en œuvre :
// our private properties:
interface ClientPrivate {
prop1: string;
prop2: number;
}
// private properties for all Client instances:
const pp = new Private<Client, ClientPrivate>();
class Client {
constructor() {
pp.set(this, {
prop1: 'hello',
prop2: 123
});
}
someMethod() {
const privateProps = pp.get(this);
const prop1 = privateProps.prop1;
const prop2 = privateProps.prop2;
}
}
Et si tout ce dont vous avez besoin est une seule propriété privée, alors cela devient encore plus simple, parce que vous n'aurez pas besoin de définir une quelconque ClientPrivate
dans ce cas.
Il est intéressant de noter que, pour la plupart, la classe Private
offre simplement une signature bien lisible, alors que l'utilisation directe de l'option WeakMap
ne le fait pas.