¿Cuál es la forma correcta de declarar tipos para Javascript generado que permite exponerlo desde una biblioteca? Parece que debería ser sencillo, pero hacer que el archivo .d.ts escrito a mano se use y se copie en outDir está resultando muy difícil. Actualmente, obtengo los archivos .d.ts generados por tsc en outDir , por lo que tiene tipos inferidos en lugar de los correctos.
Estructura fuente:
src/ __generated__/ validateEvent.js <-- generated validateEvent.d.ts <-- NOT generated, but doesn't seem to work elsewhere Event.ts index.ts validateEvent.d.ts :
import { ValidateFunction } from "ajv"; import { Event } from "../Event.js"; export const validate: ValidateFunction<Event>; export default validate; index.ts :
export * from "./Event.js"; export { default as validateEvent } from "./__generated__/validateEvent.js"; tsconfig.json :
{ "compilerOptions": { "allowJs": true, "composite": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "lib": ["es2021"], "module": "es2022", "moduleResolution": "node", "outDir": "./dist", "rootDir": "./src", "skipLibCheck": true, "sourceMap": true, "strict": true, "target": "es2022", }, "include": ["src/**/*"] }Parece que hay dos preguntas relacionadas aquí:
.d.ts en outDir en lugar del generado a partir del Javascript generado?.d.ts en otro lugar que no sea el directorio __generated__ ? (Si puedo resolver esto, tal vez el n. ° 1 sea discutible. Probé varias formas de declare module , pero nada funcionó, excepto colocar .d.ts junto a la fuente generada). Si es importante, estoy usando módulos ES y tsc --build con referencias de proyectos. Como truco temporal, estoy copiando manualmente los archivos .d.ts a outDir , pero eso no funciona tan bien con tsc --build --watch y nodemon .
Mi mejor respuesta hasta ahora es simplemente importar el Javascript generado con tipos generados y luego exportar una versión moldeada:
index.ts :
export * from "./Event.js"; import { ValidateFunction } from "ajv"; import { Event } from "./Event.js"; import { default as validateEvent0 } from "./__generated__/validateEvent.js"; export const validateEvent = validateEvent0 as ValidateFunction<Event>;