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 ese momento es un singleton. Como en, las llamadas repetidas al default del archivo devuelven la misma instancia.
Mi problema es que mis tipos se pierden entre la definición de la biblioteca y la creación de instancias.
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 instalo Factory directamente, estoy equipado con tipos correctos. Sin embargo, la interfaz exportada para el archivo intenta garantizar que la instancia siempre devuelva un singleton. En ese proceso perdemos tipificaciones.
¿Cómo debo escribir instance aquí, para retener los tipos?
Restricciones:
Puede usar el tipo de utilidad ReturnType para obtener el tipo inferido de la instancia que devuelve Factory y luego usarlo en el tipo de instance y el tipo de devolución de la exportación predeterminada. Consulte LibInstanceType 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; };