设置“纯”打字稿模块的正确方法是什么

时间:2018-11-05 17:24:21

标签: node.js typescript

我正在尝试构建一个私有模块,我知道该私有模块将仅由另一个TypeScript项目使用。

根据此(https://github.com/Microsoft/TypeScript/issues/5225),我应该能够简单地导入我的其他项目,而无需构建类型定义。

问题是当我尝试导入该库时,我缺少该库的任何依赖项的类型定义。

这里是情况:

假设您有两个项目。 libappapp导入lib,这是一个纯TypeScript节点模块。

├── app/
│   ├── dist/
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── index.js.map
│   ├── src/
│   │   └── index.ts
│   ├── package.json
│   ├── package-lock.json
│   └── tsconfig.json
└── lib/
    ├── src/
    │   └── index.ts
    ├── package.json
    ├── package-lock.json
    └── tsconfig.json

app只需从lib导入一个函数并运行它:

import lib from "lib";

lib("test");

Lib导入依赖项及其类型,并导出函数:

package.json

"dependencies": {
  "dotenv": "^6.1.0"
},
"devDependencies": {
  "@types/dotenv": "^4.0.3",
  "typescript": "^3.1.6"
}

app/src/index.ts

import dotenv from "dotenv";

dotenv.load()

export default (message: string) => {
    console.log(message);
}

当我尝试构建app时,从lib依赖项中收到有关缺少的类型定义的错误:

node_modules/lib/src/index.ts:1:20 - error TS7016: Could not find a declaration file for module 'dotenv'. 'lib/node_modules/dotenv/lib/main.js' implicitly has an 'any' type.
  Try `npm install @types/dotenv` if it exists or add a new declaration (.d.ts) file containing `declare module 'dotenv';`

1 import dotenv from "dotenv";

处理这种情况的正确方法是什么?它可以在JS / TS混合模块中正常工作,因为“编译边界”将在导入的模块及其公开的类型结束,但是由于此模块是“纯” TypeScript,因此它将像抓取所有其依赖项一样那是一个大型仓库。

进行此设置的正确方法是什么?还是真正的问题是npm install不安装dev依赖项?我应该安装所有@types作为产品依赖吗?

2 个答案:

答案 0 :(得分:1)

据此:https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

建议将所有依赖项安装为prod依赖项:

  

我们的软件包公开了每个声明中的声明,因此   我们的browserify-typescript-extension套件需要具有这些   依赖关系。因此,我们使用“依赖项”而不是   “ devDependencies”,因为否则我们的消费者将需要   手动安装这些软件包。如果我们刚刚写了一条命令   行应用程序,并且不希望我们的软件包用作库,   我们可能已经使用过devDependencies。

因此,基本上,如果要编写Typescript npm模块,则所有依赖项都必须是prod依赖项。

答案 1 :(得分:0)

是的,在我最后一次构建打字稿npm模块的经验中,我必须在@type/<package>中将键入dependencies作为package.json的第三方软件包。

我的上一个npm模块是使用ioredis构建的。所以我的模块package.json如下所示:

{
  "name": "my-redis",
  "version": "1.0.0",
  "dependencies": {
    "ioredis": "^4.2.0",
    "@types/ioredis": "^4.0.3"
  },
}

这样做,如果模块安装在其他系统中,它将自动检测到打字,否则该系统必须手动安装打字包。

相关问题