Este es un enfoque reutilizable para agregar propiedades privadas adecuadas:
/**
* 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);
}
}
Digamos que tienes una clase en Clientalgún lugar que necesita dos propiedades privadas:
prop1: string
prop2: number
A continuación se muestra cómo lo implementa:
// 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;
}
}
Y si todo lo que necesita es una sola propiedad privada, entonces se vuelve aún más simple, porque no necesitaría definir ninguna ClientPrivate en ese caso.
Vale la pena señalar que, en su mayor parte, la clase Privatesolo ofrece una firma bien legible, mientras que el uso directo WeakMapno lo hace.