【问题标题】:What's the proper way to setup a "pure" typescript module设置“纯”打字稿模块的正确方法是什么
【发布时间】:2019-04-09 02:22:22
【问题描述】:

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

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

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

情况如下:

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

├── 应用/ │   ├── 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 - 错误 TS7016:找不到模块“dotenv”的声明文件。 'lib/node_modules/dotenv/lib/main.js' 隐含了一个 'any' 类型。 如果存在,请尝试 `npm install @types/dotenv` 或添加包含 `declare module 'dotenv';` 的新声明 (.d.ts) 文件 1 从“dotenv”导入 dotenv;

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

设置的正确方法是什么?还是npm install 没有安装开发依赖项的真正问题?我应该将所有 @types 安装为产品依赖项吗?

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

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

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

    我们的包暴露了每一个的声明,所以任何用户 我们的 browserify-typescript-extension 包需要有这些 依赖关系也是如此。出于这个原因,我们使用“依赖”而不是 “devDependencies”,否则我们的消费者将需要 手动安装这些软件包。如果我们刚刚写了一个命令 行应用程序并且不期望我们的包被用作库, 我们可能使用了 devDependencies。

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

    【讨论】:

      【解决方案2】:

      是的,在我上次构建 typescript npm 模块的经验中,我必须将我们的第 3 方包类型 @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"
        },
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-08
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 2013-09-06
        • 1970-01-01
        相关资源
        最近更新 更多