在打字稿中书写NPM模块

我正在开发我的第一个NPM模块。 之前我曾经使用过打字稿,而且很多问题是很多模块没有可用的定义文件。 所以我认为在打字稿中写我的模块是一个好主意。

但是,我找不到任何有关如何做到这一点的最佳方法。 我发现这个相关的问题“ 我可以用coffeescript编写npm包吗? ”,其中人们build议只发布javascript文件。 但是与coffeescript文件相反,打字稿文件在打字稿应用程序中使用时可能会非常有用。

我应该在发布NPM模块时包含Typescript文件,还是应该只发布JavaScript文件并将生成的.d.ts文件提供给DefinitelyTyped?

以下是使用TypeScript编写的示例Node模块: https : //github.com/basarat/ts-npm-module

以下是使用此示例模块的示例TypeScript项目https://github.com/basarat/ts-npm-module-consume

基本上你需要:

  • commonjsdeclaration:true编译declaration:true
  • 生成一个.d.ts文件

接着

  • 让你的ide读取生成的.d.ts

Atom-TypeScript只是提供了一个很好的工作stream程: https : //github.com/TypeStrong/atom-typescript#packagejson-support

这是使用TypeScript 1.8.10的更近的答案:

我的项目结构是:

 | |--- 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 

我在.npmignore添加了以下内容,以避免包含多余的文件,并保持导入和运行包的最低限度:

 node_modules/ *.log *.tgz src/ test/ gulpfile.js tsconfig.json tslint.json typings.json typings dist/test 

我的.gitignore有:

 typings # ignore .js.map files *.js.map *.js dist 

我的package.json有:

 "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", 

现在我运行: npm pack

生成的文件(解压缩时)具有以下结构:

 | |--- dist | |--- src | | | index.js | index.js.map | index.d.ts | package.json README.md 

现在我转到我想用作库的项目,input: npm install ./project-1.0.0.tgz

它成功安装。

现在我在我刚刚安装了npm import Project = require("project");项目中创build了一个index.ts文件import Project = require("project");

打字Project. 给我的Intellisense选项,这是整个演习的重点。

希望这可以帮助其他人在他们更大的项目中使用他们的TypeScript npm项目作为内部库。

PS:我相信这种将项目编译成可以在其他项目中使用的npm模块的方法让人想起.NET世界中的.dll 。 我可以很好地想象项目被组织在VS中的解决scheme中,每个项目生成一个npm包,然后可以在解决scheme的另一个项目中用作依赖项。

由于我花了相当长的时间才弄明白这一点,所以我贴出来,以防有人被困在这里。

我也发布了一个封闭的错误: https : //github.com/npm/npm/issues/11546


这个例子已经上传到Github: vchatterji / tsc-seed

2017 / Typescript 2.x中的推荐方式:

  • 像平常一样创build你的项目(包括testing和一切)
  • 添加declaration: truetsconfig.json产生tsconfig.json
  • 通过index.ts导出API
  • package.json ,指向你生成的types。 例如,如果您的outDirdist ,那么将"types": "dist/index.d.ts"到您的包json中。
  • 创build一个.npmignore忽略不必要的文件(例如源文件)。
  • npm publish发布到npm。 使用semvar规格进行更新(修补程序/错误修复npm version patch ,非破坏补充npm version minor ,打破api更改npm version major

因为它让我花了一段时间来筛选掉所有关于这个主题的过时的资源(比如这个页面上的那个…),我决定把它包装在一个如何编写一个打字稿库中 ,最新的工作最小的例子。

您可以使用autodt来处理从npm分发和使用.d.ts文件,而不需要Atom IDE的支持。

autodts generate会将所有你自己的.d.ts文件捆绑在一起,以便在npm上发布, autodts link处理对其他已安装软件包的引用,这些软件包可能并不总是直接位于一个较大的项目的node_modules

两个命令tsconfig.json以“convention over configuration”风格从package.jsontsconfig.json中读取它们的设置。

在stackoverflow上还有另外一个答案 ,还有一个更详细的博客文章 。

我主要遵循Varun Chatterji的build议

但是,我想展示一个完整的unit testing和代码覆盖范例,并将其发布到npm ,并使用javascript或inputtypescript

这个模块是使用typescript 2.2编写的,重要的是configurationprepublish钩子来使用tsc编译代码,然后发布到npm

https://github.com/sweetim/haversine-position

https://www.npmjs.com/package/haversine-position

您应该发布原始打字稿来源而不是types定义。 在package.json让'types'属性指向* .ts文件。

*.d.ts是很好的注释现有的JS库,但作为一个消费者,我宁愿阅读打字稿代码,而不是在types定义和生成的JS代码之间切换。

在Lossless中,我们为npm包创build了一站式TypeScript开发工具: https ://gitzone.gitlab.io/npmts/