node.js - Dividir un paquete NPM de TypeScript en múltiples archivos sin exponer componentes internos
Tengo un paquete NPM escrito en TypeScript que está diseñado para funcionar con aplicaciones Node.js. Tengo clases en este paquete que tienen métodos que son solo para uso interno, aunque no puedo marcarlos como privados porque son utilizados por otros componentes dentro del paquete. Para resolver este problema, no exporto la clase desde el proyecto, y cuando devuelvo una instancia de la clase al llamador, la convierto en un tipo de interfaz que solo tiene los métodos accesibles públicamente.
Esto funciona bien, pero si quiero dividir mi proyecto en archivos más pequeños, ¿cómo puedo hacer esto sin verme obligado a exportar mis clases y arriesgarme al uso indebido de mi módulo NPM?
Aquí hay un ejemplo simplificado de lo que estoy tratando de hacer:
Archivo: internal.ts
// Can I make this class not publicly accessible?
export class InternalClass {
constructor() {
}
public sharedMethod(): void {
// Accessible to users of the package
}
public protectedMethod(): void {
// Only for use within the package
}
}
Archivo: external.ts
import { InternalClass } from "./internal";
export interface ExternalInterface {
sharedMethod(): void;
// protectedMethod is not available outside the package
}
export function makeInterface(): ExternalInterface {
return new InternalClass();
}
Cualquier idea sobre cómo hacer esto bien sería muy apreciada.
Respuesta #1
La forma en que hago esto es controlando qué se expone exactamente por el paquete npm.
Por ejemplo, si mi package.json se ve así:
{
....
"main": "dist/index.js",
"typings": "typings/index.d.ts",
....
}
entonces, en el correspondiente index.ts puedo controlar manualmente lo que se expondrá (exportará) como parte del paquete.
export * from "./lib/Helper";
export * from "./lib/Log";
import * as M from "./lib/Maps";
export {M as Maps};
Si tengo un módulo/clase que no quiero que sea accesible "externamente", simplemente no lo exporto como parte de index.ts o de sus elementos referenciados. Sin embargo, esto no me prohíbe importarlo y usarlo internamente en el mismo paquete.
