Tengo un SDK de javascript azucarado donde se crea una instancia de la biblioteca en cualquier punto dado en tiempo de ejecución, pero a partir de entonces es un singleton. Al igual que en, las llamadas repetidas al default del archivo devuelven la misma instancia.

Mi problema es que mis mecanografiados se pierden entre la definición de la biblioteca y la instanciación.

Ver este código:

const Factory = (args?: Record<string, unknown>) => {

  return {
    action: {
        method: (code: 'SOME'|'CODES') => console.log('Doing something with', code)
    }
  }
}

let instance

export default (args?: Record<string, unknown>) => {

  if (!instance)
    instance = Factory(args)

  return instance

}

Si creo una instancia de Factory directamente, me proporcionarán las mecanografías correctamente. Sin embargo, la interfaz exportada para el archivo intenta garantizar que la instancia siempre devuelva un singleton. En ese proceso perdemos mecanografía.

¿Cómo debo escribir instance aquí para conservar la escritura?

Restricciones:

  • No quiero tener que volver a escribir todo en una interfaz que coincide libremente con la definición
  • El usuario puede crear una instancia de la instancia inicial en cualquier momento durante el tiempo de ejecución (no se puede suponer que se haya creado en bootstrap)
  • No debería usar clases debido a la potencial complejidad de los métodos anidados que se devuelven.
1
shennan 24 nov. 2021 a las 13:02

1 respuesta

La mejor respuesta

Puede utilizar el tipo de utilidad ReturnType para obtenga el tipo inferido de la instancia que devuelve Factory, luego utilícelo en el tipo de instance y el tipo de retorno de la exportación predeterminada. Consulte LibInstanceType a continuación:

const Factory = (args?: Record<string, unknown>) => {

  return {
    action: {
        method: (code: 'SOME'|'CODES') => console.log('Doing something with', code)
    }
  }
};

type LibInstanceType = ReturnType<typeof Factory>;

let instance: LibInstanceType | undefined;

export default (args?: Record<string, unknown>): LibInstanceType => {

  if (!instance)
    instance = Factory(args);

  return instance;

};

Enlace de juegos

1
T.J. Crowder 24 nov. 2021 a las 13:10
1
Vaya, he estado usando TypeScript durante más de 6 meses y todavía no me había encontrado con el tipo de utilidad ReturnType. ¡Gracias!
 – 
shennan
24 nov. 2021 a las 13:24