ret*_*ame 6 import node.js typescript
我有一个用 Typescript(我们称之为libd)编写的 NPM 包,它提供了一些类和类型。它们导出到一个index.ts文件中,如下所示:
export { ClassA } from "./ClassA";
export { TypeB } from "./TypeB";
Run Code Online (Sandbox Code Playgroud)
在ClassA使用外部依赖(我们称之为depc)被设置为在peerDependencies package.json。这TypeB只是一种没有任何外部依赖关系的类型。
在package.json主字段中设置为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
}
}
Run Code Online (Sandbox Code Playgroud)
现在我TypeB在另一个库中使用它(让我们称之为libe),而无需导入ClassA并且没有depc安装依赖项。该libd库是通过 NPM 安装的,类型是这样导入的:
import { TypeB } from "libd";
Run Code Online (Sandbox Code Playgroud)
该tsconfig.json的libe是类似于从一个libd。
转译这给了我错误TS2307: Cannot find module 'depc'。
现在我明白了,如果我要使用ClassA我必须安装,depc因为它会导入它。但我只使用TypeB不需要任何依赖项的类型,有时类型随原始包一起提供。
我可以通过安装来解决这个问题@types/depc,Typescript 会很高兴。代码应该在运行时工作,因为没有实际使用depc来自libe. 但我宁愿不安装无用的包。
"skipLibCheck": true在tsconfig.jsonof 中设置libe也会修复 tsc 错误,但我不确定这会产生什么负面影响。
所以我的问题是:为什么打字稿会从我没有导入的依赖项中检查一个类?是不是因为我已将libd包的所有导出捆绑在一个index.ts文件中,并且这些包的所有导入都通过此索引文件?
我可以在不分离TypeB并ClassA放入不同包的情况下解决这个问题吗?这将使它们成为非常小的软件包,并且大约 80% 的时间它们都将被安装。
\n\n是吗,因为我已经将
\nlibd包的所有导出捆绑在一个index.ts文件 [\xe2\x80\xa6] 中吗?
是的。
\nTypeScript 编译器发现您正在使用该文件libd/dist/index.{js|d.ts}并开始评估其导出。这样做时,它发现正在ClassA使用depc,并进行评估depc, \xe2\x80\x93 但找不到它(因为它没有安装)。这是一个明确的错误。
TypeScript 编译器不会检查您是否正在使用ClassA,执行树摇晃不是它的工作。
使用"skipLibCheck": true实际上是解决这个问题的一个好方法,因为它的描述明确指出:
\n\n而不是对所有内容进行全面检查
\nd.ts文件进行全面检查,而是会键入检查您在 app\xe2\x80\x99s 源代码中特别引用的代码。
\xe2\x80\xa6 这最终就是你想要的,对吧?
\n| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |