在打字稿中书写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/