Estoy trabajando en mi primer módulo npm. Trabajé brevemente con TypeScript antes y un gran problema fue que para muchos módulos no había archivos de definición disponibles. Así que pensé que sería una buena idea escribir mi módulo en TypeScript.
Sin embargo, no puedo encontrar ninguna información sobre la mejor manera de hacerlo. Encontré esta pregunta relacionada " ¿Puedo escribir el paquete npm en CoffeeScript? " donde las personas sugieren publicar solo los archivos JavaScript. Pero a diferencia de los archivos CoffeeScript, los archivos TypeScript pueden ser realmente útiles si se usan dentro de una aplicación TypeScript.
¿Debo incluir archivos TypeScript al publicar un módulo npm, o solo debo publicar los archivos JavaScript y proporcionar los archivos .d.ts generados a DefinitelyTyped?
Aquí hay un módulo de nodo de muestra escrito en TypeScript: https://github.com/basarat/ts-npm-module
Aquí hay un proyecto TypeScript de muestra que usa este módulo de muestra https://github.com/basarat/ts-npm-module-consume
Básicamente necesitas:
commonjs y declaration:true.d.tsY luego
.d.ts generado.Atom-TypeScript solo proporciona un buen flujo de trabajo en torno a esto: https://github.com/TypeStrong/atom-typescript#packagejson-support
Con TypeScript 4.x, TypeScript 3.x o TypeScript 2.x, los siguientes pasos describen lo que debe hacer para crear una biblioteca (paquete npm) con TypeScript:
declaration: true a tsconfig.json para generar tipos.index.tspackage.json , apunte a sus tipos generados. Por ejemplo, si su outDir es dist , agregue "types": "dist/index.d.ts" a su paquete json.package.json , apunte a su archivo de entrada principal. Por ejemplo, si su outDir es dist y el archivo de entrada principal es index.js , agregue "main": "dist/index.js" a su paquete.json.package.json , incluya en la lista blanca los archivos que le gustaría enviar a npm: files: ["/dist"] . Un enfoque alternativo es la lista negra con .npmignore , pero es más difícil mantenerse actualizado.npm publish . Use las especificaciones de semver para las actualizaciones (parche/corrección de errores parche de npm version patch , adiciones no npm version minor de npm, cambios de api npm version major )Dado que me tomó un tiempo examinar todos los recursos obsoletos sobre este tema en Internet (como el que se encuentra en esta página...), decidí envolverlo en una biblioteca de cómo escribir un mecanografiado con un ejemplo mínimo de trabajo actualizado.
Esta es una respuesta más reciente usando TypeScript 1.8.10:
La estructura de mi proyecto es:
| |--- src |--- test |--- dist <= My gulp file compiles and places the js, sourcemaps and .d.ts files here | |--- src | |--- test |--- typings .gitignore .npmignore gulpfile.js package.json README.md tsconfig.json tslint.json typings.json Agregué lo siguiente en .npmignore para evitar incluir archivos extraños y mantener el mínimo indispensable para que el paquete se importe y funcione:
node_modules/ *.log *.tgz src/ test/ gulpfile.js tsconfig.json tslint.json typings.json typings dist/test Mi .gitignore tiene:
typings # ignore .js.map files *.js.map *.js dist Mi package.json tiene:
"main": "dist/src/index.js", "typings": "dist/src/index.d.ts", Ahora ejecuto: npm pack
El archivo resultante (cuando se descomprime) tiene la siguiente estructura:
| |--- dist | |--- src | | | index.js | index.js.map | index.d.ts | package.json README.md Ahora voy al proyecto donde quiero usar esto como biblioteca y escribo: npm install ./project-1.0.0.tgz
Se instala con éxito.
Ahora creo un archivo index.ts en mi proyecto donde acabo de instalar npm import Project = require("project");
Project. me da las opciones de Intellisense, que era el objetivo de todo este ejercicio.
Espero que esto ayude a alguien más a usar sus proyectos TypeScript npm como bibliotecas internas en sus proyectos más grandes.
PD: Creo que este enfoque de compilar proyectos en módulos npm que se pueden usar en otros proyectos recuerda al .dll en el mundo .NET . Bien podría imaginar proyectos organizados en una Solución en VS Code donde cada proyecto produce un paquete npm que luego se puede usar en otro proyecto en la solución como una dependencia.
Dado que me tomó bastante tiempo resolver esto, lo he publicado en caso de que alguien se quede atrapado aquí.
También lo publiqué por un error cerrado en: https://github.com/npm/npm/issues/11546
Este ejemplo ha sido subido a Github: vchatterji/tsc-seed