打字稿:从包中导入类型而不依赖同一包中的其他类型

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.jsonlibe是类似于从一个libd

转译这给了我错误TS2307: Cannot find module 'depc'

现在我明白了,如果我要使用ClassA我必须安装,depc因为它会导入它。但我只使用TypeB不需要任何依赖项的类型,有时类型随原始包一起提供。

我可以通过安装来解决这个问题@types/depc,Typescript 会很高兴。代码应该在运行时工作,因为没有实际使用depc来自libe. 但我宁愿不安装无用的包。

"skipLibCheck": truetsconfig.jsonof 中设置libe也会修复 tsc 错误,但我不确定这会产生什么负面影响。

所以我的问题是:为什么打字稿会从我没有导入的依赖项中检查一个类?是不是因为我已将libd包的所有导出捆绑在一个index.ts文件中,并且这些包的所有导入都通过此索引文件?

我可以在不分离TypeBClassA放入不同包的情况下解决这个问题吗?这将使它们成为非常小的软件包,并且大约 80% 的时间它们都将被安装。

Dmi*_*sky 2

\n

是吗,因为我已经将libd包的所有导出捆绑在一个index.ts文件 [\xe2\x80\xa6] 中吗?

\n
\n

是的。

\n

TypeScript 编译器发现您正在使用该文件libd/dist/index.{js|d.ts}并开始评估其导出。这样做时,它发现正在ClassA使用depc,并进行评估depc, \xe2\x80\x93 但找不到它(因为它没有安装)。这是一个明确的错误。

\n

TypeScript 编译器不会检查您是否正在使用ClassA,执行树摇晃不是它的工作。

\n

使用"skipLibCheck": true实际上是解决这个问题的一个好方法,因为它的描述明确指出:

\n
\n

而不是对所有内容进行全面检查d.ts文件进行全面检查,而是会键入检查您在 app\xe2\x80\x99s 源代码中特别引用的代码。

\n
\n

\xe2\x80\xa6 这最终就是你想要的,对吧?

\n