TypeScript no copia archivos d.ts para compilar
Entonces, tal vez estoy confundido, pero pensé que si agregaba declaration:truea mi tsconfig.json podría hacer que tsc copiara mis *.d.tsarchivos, junto con el código transpilado y sus d.tsarchivos.
P.EJ:
- src
- lib
- types.d.ts
- foo.ts
Esperaría que el resultado de tsc fuera algo como:
- build
- lib
- types.d.ts
- foo.js
- foo.d.ts
Sin embargo, parece que no puedo types.d.tscopiarme en mi directorio de compilación.
¿El mecanografiado no proporciona ningún mecanismo para copiar .d.tsarchivos? ¿O simplemente tengo una configuración incorrecta en alguna parte? (He probado muchas configuraciones diferentes en este punto; nada parece funcionar)
Respuestas
Tiene razón: declaration:trueimplica que solo para cada .tsarchivo dado se tscgenera y copia un .d.tsarchivo de salida correspondiente al builddirectorio (además de .jsy .mapsi corresponde). Por tsclo tanto , no copiará su types.d.tsarchivo personalizado al directorio de salida.
Básicamente, los .d.tsarchivos se consideran una entrada intocable para que el compilador realice comprobaciones de tipo. No se utilizan para ninguna generación de salida, lo que también significa que no se copian en build. Puedes leer máshttps://github.com/Microsoft/TypeScript/issues/5112 sobre el punto de vista de los mantenedores:
Los archivos .d.ts que usa son una entrada al sistema de compilación, pero no una salida. Es perfectamente razonable consumir algunos tipos de un .d.ts pero hacer que su salida no use esos tipos, por lo que no habría razón para distribuir los .d.ts de entrada con los resultados de su compilación. [...] Parece que querrá un paso posterior a la compilación en su herramienta de compilación para copiar los archivos .d.ts relevantes donde los necesite.
Los archivos .d.ts se consideran "referencias", el compilador no los tocará, no los moverá ni los volverá a crear. Una forma fácil de pensar en los archivos .d.ts es que van junto con sus archivos .js. si está copiando los archivos .js, debe copiar el .d.ts correspondiente.
Solución n. ° 1: copie archivos d.ts mediante el paso de compilación manual
Una posible solución es copiar todos los .d.tsarchivos necesarios como types.d.tsmanualmente en un paso de compilación. La herramienta concreta es la preferencia y depende de su proyecto y tipo de construcción, SO, entre otros. Esta herramienta debe preservar la estructura del directorio debajo srcal copiar archivos build, para que las importreferencias de tipo aún funcionen. Para nombrar unos pocos:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(shell), rsync, robocopyo una plataforma paquete NPM independiente comohttps://www.npmjs.com/package/copyfiles:
"scripts": {
"copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" build"
}
Solución # 2: Reescriba los archivos d.ts a la extensión .ts
Reformule sus .d.tsarchivos a la .tsextensión (o vuelva a integrar los tipos en .tsarchivos existentes ), por lo que tscse encarga de emitir las declaraciones en la salida. Ligera desventaja: no tiene una separación impuesta por el compilador entre los tipos y el código de implementación (los d.tsarchivos no pueden contener código). La gran ventaja es que no necesita un paso de compilación adicional.
En mi opinión, este último es el enfoque más fácil para generar una API pública, por ejemplo, para su paquete npm, mientras que un .d.tsarchivo podría ser candidato para una declaración de tipo compartida y utilizada internamente.
Espero que ayude.