es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo exportar un alias de tipo para una clase existente

Tengo un módulo TS que está profundamente anidado en espacios de nombres. No puedo evitar esto porque se genera automáticamente a partir de una biblioteca de Java (estoy escribiendo NativeScript).

Quiero “reexportar” estas clases anidadas en mi propio módulo, a nivel superior.

Digamos que tengo una clase declarada de la siguiente manera en native-types.d.ts:

declare module com {
    export module esp32 {
        export module blufi {
            export class BlufiClient {
                ....
            }
        }
    }
}

Luego, en el código de mi propio módulo, index.ts:

export type BlufiClient = com.esp32.blufi.BlufiClient;

El archivo de declaraciones generado automáticamente, index.d.ts:

export declare type BlufiClient = com.esp32.blufi.BlufiClient;

El objetivo aquí es permitir a los usuarios de mi módulo hacer algo así:

import { BlufiClient } from 'nativescript-blufi';

const client = new BlufiClient(...);

Pero el error que obtengo al intentar hacer “new” en la clase es:

‘BlufiClient’ solo se refiere a un tipo, pero se está usando como valor aquí.

Inicialmente, pensé que tenía que exportar type BlufiClient = typeof …, pero eso no funcionó, y tiene sentido que no lo haya hecho porque está apuntando a una clase, no a un constructor ni a un miembro.

¿Cómo puedo lograr esto?

Para intentar ilustrar el problema de manera más clara, aquí hay un proyecto de ejemplo que puedes ejecutar en tu navegador:
https://playcode.io/849389

En este ejemplo, native_module.ts es el módulo sobre el que no tengo control y debe mantenerse como está.

my_module.ts es donde intento “reexportar” las clases en native_module.ts para que estén disponibles sin tener que escribir la ruta completa del módulo (es decir, com.esp32.blufi…). También espero agregar alguna funcionalidad adicional en mi_module que no esté disponible en native_module en el futuro.

Finalmente, test_module.ts simplemente intenta instanciar la clase “reexportada”. Puedes ver el error que estoy obteniendo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para abordar este problema, puedes usar la instrucción import junto con una importación de espacio de nombres. Así es cómo puedes modificar tu index.ts:

    import * as blufi from './native_module';
    
    export { blufi };
    

    En este ejemplo, estamos importando todo desde native_module usando la sintaxis *, y lo asignamos a una importación de espacio de nombres llamada blufi. Luego, simplemente volvemos a exportar el objeto completo blufi desde nuestro módulo.

    Esto te permitirá usar las clases en native_module en el nivel superior de tu propio módulo, de esta manera:

    import { BlufiClient } from 'my_module';
    
    const client = new BlufiClient(...);
    

    Ten en cuenta que deberás transpilar este código usando una herramienta como webpack o tsc, ya que las importaciones de espacio de nombres aún no son compatibles de forma nativa en todos los navegadores. Además, debes tener en cuenta que podrías encontrar problemas si hay conflictos de nombres entre las clases en native_module y tu propio módulo.

Comments are closed.