singleton - Clase de Typescript - ¿Debería un campo privado estar en el constructor?
He escrito una clase singleton en Typescript para evitar tener que seguir declarando/creando el mismo objeto OktaAuth, a saber: new OktaAuth({ issuer: appConfig.OKTA_ORG_URL }).
(Por cierto, hice esto ya que asumo que esta es la mejor manera de escribir tales cosas)
Así que por el momento mi código se ve así
export class OktaAuthorisation {
private static instance: OktaAuthorisation;
private constructor() {
}
static getInstance(): OktaAuthorisation {
if (!OktaAuthorisation.instance) {
OktaAuthorisation.instance = new OktaAuthorisation();
}
return OktaAuthorisation.instance;
}
private authClient = new OktaAuth({ issuer: appConfig.OKTA_ORG_URL });
async accessToken(): Promise<OktaAccessToken> {
return await this.authClient.tokenManager.get("accessToken");
}
async getOktaUserEmail() {
let oktaUser: OktaUser = await this.authClient.token.getUserInfo(await this.accessToken());
return oktaUser.email
}
}
Mi pregunta es, ¿dónde debería estar la línea private authClient=new OktaAuth({ issuer: appConfig.OKTA_ORG_URL });? ¿Dónde está en lo anterior o debería estar configurándola en el constructor?
No estoy seguro de si se recrearía cada vez que lo use, lo cual sí me gusta:
const oktaAuth = OktaAuthorisation.getInstance();
const myUser = await oktaAuth.getOktaUserEmail()
Además, en general, ¿es la manera más ordenada de hacer esto? Y si no uso el constructor para nada, supongo que puedo eliminarlo?
Gracias.
Respuesta #1
Cuando sea posible, establezca el estado de la clase en las declaraciones de los campos, no en el constructor. Esto ayuda porque:
- evita errores accidentales de null/undefined,
- ayuda a los lectores humanos a determinar rápidamente los valores predeterminados,
- reduce el número de líneas de código.
Ya sea que establezcas el estado de la clase en la declaración del campo o en el constructor, ese estado solo se recreará cada vez que crees una nueva instancia de la clase, no cada vez que accedas al campo.
Dicho todo esto... ya sea que establezcas el estado de la clase en las declaraciones de campo o en el constructor, la salida del compilador de TypeScript lo establece en el constructor (por defecto). Eso se debe a que el JavaScript/ECMAScript principal no soporta declaraciones de campo (aunque planea hacerlo pronto). Aquí hay un ejemplo del playground con TypeScript a la izquierda y la salida del compilador a la derecha.
