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

Gai*_*din 6 node.js typescript

我正在尝试构建一个我知道只会被另一个TypeScript项目使用的私有模块.

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

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

情况如下:

假设你有两个项目. libapp. appimport 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");
Run Code Online (Sandbox Code Playgroud)

Lib导入依赖关系及其类型,并导出一个函数:

package.json:

"dependencies": {
  "dotenv": "^6.1.0"
},
"devDependencies": {
  "@types/dotenv": "^4.0.3",
  "typescript": "^3.1.6"
}
Run Code Online (Sandbox Code Playgroud)

app/src/index.ts:

import dotenv from "dotenv";

dotenv.load()

export default (message: string) => {
    console.log(message);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试构建时,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依赖项的真正问题?我应该安装所有的@typesprod依赖项吗?

Gai*_*din 2

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

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

我们的包公开了每个包的声明,因此 browserify-typescript-extension 包的任何用户也需要具有这些依赖项。因此,我们使用“依赖项”而不是“devDependency”,因为否则我们的消费者将需要手动安装这些包。如果我们刚刚编写了一个命令行应用程序并且不希望我们的包被用作库,那么我们可能会使用 devDependency。

所以基本上如果你正在编写一个 typescript npm 模块,所有依赖项都必须是 prod 依赖项。