node.js - Typescript:从包中导入类型,而不依赖于同一包中的其他类型
问题描述
我有一个用 Typescript(我们称之为libd
)编写的 NPM 包,它提供了一些类和类型。它们被导出到这样的index.ts
文件中:
export { ClassA } from "./ClassA";
export { TypeB } from "./TypeB";
ClassA
正在depc
使用在package.json
. 这TypeB
只是一个没有任何外部依赖的类型。
在package.json
main 字段中设置为dist/index.js
(它被转换到的位置)并且类型设置为dist/index.d.ts
.
包的样子是这样tsconfig.json
的:libd
{
"compilerOptions": {
"target": "ES2019",
"module": "commonjs",
"declaration": true,
"outDir": "dist",
"rootDir": "src",
"inlineSources": true,
"inlineSourceMap": true
}
}
现在我TypeB
在另一个库(让我们称之为libe
)中使用它而不导入ClassA
并且没有depc
安装依赖项。该libd
库是通过 NPM 安装的,并且类型是这样导入的:
import { TypeB } from "libd";
的类似于tsconfig.json
的。libe
libd
转译这给了我错误TS2307: Cannot find module 'depc'
。
现在我明白了,如果我要使用ClassA
我必须安装depc
,因为它会导入它。但我只使用TypeB
它不需要任何依赖项,有时类型与原始包一起提供。
我可以通过安装来解决这个问题@types/depc
,Typescript 会很高兴。代码应该在运行时工作,因为没有实际使用depc
来自libe
. 但我宁愿不安装无用的软件包。
设置of也可以修复 tsc 错误"skipLibCheck": true
,但我不确定这会产生什么负面影响。tsconfig.json
libe
所以我的问题是:为什么打字稿会从我没有导入的依赖项中检查一个类?是不是因为我已经将libd
包的所有导出捆绑在一个index.ts
文件中,并且所有导入都通过这个索引文件?
我可以在不分离TypeB
并ClassA
分成不同的包的情况下解决这个问题吗?这将使它们成为非常小的软件包,并且在大约 80% 的时间内它们都将被安装。
解决方案
是不是因为我已将
libd
包的所有导出捆绑在一个index.ts
文件中 [...]?
是的。
TypeScript 编译器看到您正在使用该文件libd/dist/index.{js|d.ts}
并开始评估其导出。这样做时,它发现它ClassA
正在使用depc
,并去评估depc
, - 但它无处可寻(因为它没有安装)。这是一个确定的错误。
TypeScript 编译器不会检查您是否在使用ClassA
,执行摇树不是它的工作。
使用"skipLibCheck": true
实际上是解决这个问题的好方法,因为它的描述明确指出:
TypeScript 不会对所有文件进行全面检查,而是
d.ts
对您在应用程序源代码中特别引用的代码进行类型检查。
......这最终是你想要的,对吧?
推荐阅读
- listview - FutureBuilder 只加载一次 API 数据
- scala - 在 scalatest 中实现类似 Junit @BeforeAll 的行为
- javascript - Li click 不适用于 select2 插件
- android - 如何隐藏/显示特定的 RecyclerView 项目?
- python-3.x - 将新数据点拟合到现有集群中
- ios - 在 appdelegate 中跳过登录屏幕无法快速工作
- python - 根据名称列表下载汽车图片列表
- sql - 如何计算一个 SQL Server 数据库对象的所有表中的特定列名
- postgresql - PostgresSQL Alter 列为日期类型提供无效的输入语法:“”
- macos - 尝试在 Mac OS Catlina 上运行 opensmile-2.3.0 时出现“错误:全局命名空间中没有名为“signbit”的成员?