使用带有TypeScript的npm模块 - 甚至无法使最简单的示例正常工作

dum*_*ter 0 javascript node.js npm typescript

我想在Typescript程序中使用npm模块.幸运的是,我遇到了这个看起来非常简单,确实似乎有效.我想我会尝试添加另一个包,只是为了得到它的悬念.所以我把它分叉并做了一个相对简单的提交.

这是我在提交中所做的所有事情:

  1. 添加pubsub-js到我的依赖项中package.json,因此它将安装在npm install.

  2. 设置tsd,用于安装TypeScript定义pubsub-js,并将其设置为自动运行npm install.

  3. 修改index.ts为包含已安装的定义:

    /// <reference path="./typings/pubsubjs/pubsub.d.ts" />
    
    Run Code Online (Sandbox Code Playgroud)

    并导入已安装的包:

    import PubSub = require('pubsub-js');
    
    Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.我收到此错误:

$ npm install
$ npm test
> demo-typescript-node-minimal@0.0.1 test /home/dumbmatter/projects/mini/demo-typescript-node-minimal
> tsc index.ts --module commonjs && node ./index

index.ts(10,25): error TS2307: Cannot find module 'pubsub-js'.
npm ERR! Test failed.  See above for more details.
Run Code Online (Sandbox Code Playgroud)

(如果你想自己动手,克隆我的仓库,运行npm install,然后npm test.)

我想重申一下,原始版本(没有我的提交,直接来自原始回购)确实有效:

$ git checkout d002c0dffc9d9f65aca465b0fc6a279bcd23202d
$ npm test

> demo-typescript-node-minimal@0.0.1 test /home/dumbmatter/projects/mini/demo-typescript-node-minimal
> tsc index.ts --module commonjs; node ./index

[ 'abc', index: 0, input: 'abcdefgh' ]
Hello Dave
Run Code Online (Sandbox Code Playgroud)

什么给出了什么?为什么我的尝试失败如此悲惨?

我也很感激任何有关在TypeScript中使用npm包的智慧的建议.是否只是容易出错才能真正使用?如果是这样,你发现自己处于你想要使用的TypeScript程序中的一些通用pubsub库的情况......你会怎么做?写你自己的?

Rya*_*ugh 5

问题是pubsub.d.ts不包含CommonJS模块的定义"pubsub-js"(而是只定义一个全局对象PubSubJS).

最好的解决方法是编辑该文件; 在底部添加:

declare module "pubsub-js" {
  export = PubSub;
}
Run Code Online (Sandbox Code Playgroud)

当CommonJS或AMD模块可用于给定包时,大多数.d.ts文件已包含此类定义.