当前位置: 首页 > 知识库问答 >
问题:

设置“纯”类型脚本模块的正确方法是什么

何超英
2023-03-14

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

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

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

情况如下:

假设你有两个项目<代码>库和应用程序app导入lib,这是一个纯类型脚本节点模块。

├── 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模块中工作得很好,因为“编译边界”将在导入的模块及其公开的类型处结束,但由于该模块是“纯”类型脚本,它将对其所有依赖项进行爬网,就好像它是一个大型repo一样。

设置这个的正确方法是什么?或者真正的问题是npm安装没有安装dev依赖项?我应该安装所有的@type作为prod依赖项吗?

共有2个答案

谷光誉
2023-03-14

是的,在我上一次构建typescript npm模块的经验中,我必须包括我们的第三方软件包打字@type/

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

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

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

汪茂
2023-03-14

根据这个:https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html

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

我们的包公开了其中每一个的声明,因此我们的browserify typescript扩展包的任何用户都需要具有这些依赖关系。出于这个原因,我们使用了“依赖项”而不是“devdependency”,因为否则我们的消费者将需要手动安装这些软件包。如果我们刚刚编写了一个命令行应用程序,而不希望我们的包被用作库,那么我们可能会使用devdependency。

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

 类似资料:
  • 问题内容: 我正在Heroku上编写一个node.js应用程序,并使用pg模块。我无法弄清楚为查询数据库所需的每个请求获取客户端对象的“正确”方法。 该文档使用如下代码: 但是,您肯定不需要在使用数据库的每个函数中调用对吗?我看过其他执行此操作的代码: 我倾向于第二种选择,因为我相信Heroku的免费数据库实例无论如何都仅限于一个连接,但是以这种方式进行操作是否有任何弊端?每次使用之前,是否需要检

  • 问题内容: 我在Django 1.6上无法正常使用翻译存在问题。我已将此添加到我的settings.py中: 还添加了中间件: 以及每当我使用应为l10nd的字符串时的* .py文件: 我的模板开始于: 在模板内部,我使用了trans占位符。例如 我在locale / de / LC_MESSAGES / django.po中提供了翻译: 问题答案: 添加到并将其设置如下: 请注意,它必须是一个元

  • 问题内容: 我的代码如下: 如果在获取之前设置标题,可以吗?我的标头会被发送,还是服务器会看到默认的用户代理(如果有)? 问题答案: 必须 先设置标头,然后才能产生任何影响- 如果连接已经打开,则将引发。 就头而言,如果已设置,则应将其发送。 请参阅URLConnection JavaDoc。

  • 问题内容: 在UML图上,代表模板类的正确方法是什么? 问题答案: 在右上角带有虚线矩形的普通矩形,代表模板参数。像这样:

  • 我在试图让我的文本字段与我在控制器类中定义的ActionEvent句柄连接时遇到问题。这个错误是由java造成的。朗,反思一下。调用TargetException。我一直试图在视图中创建控制器类的实例,然后使用lamba方法引用调用控制器类中的handle方法。 查看类 控制器类 主课 堆栈跟踪

  • git_repository/android_project/settings.gradle完整清单 git_repository/android_project/build.gradle完整清单