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.
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 tuindex.ts
:En este ejemplo, estamos importando todo desde
native_module
usando la sintaxis*
, y lo asignamos a una importación de espacio de nombres llamadablufi
. Luego, simplemente volvemos a exportar el objeto completoblufi
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: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.