首页 > 解决方案 > Typescript:从包中导入类型,而不依赖于同一包中的其他类型

问题描述

我有一个用 Typescript(我们称之为libd)编写的 NPM 包,它提供了一些类和类型。它们被导出到这样的index.ts文件中:

export { ClassA } from "./ClassA";
export { TypeB } from "./TypeB";

ClassA正在depc使用在package.json. 这TypeB只是一个没有任何外部依赖的类型。

package.jsonmain 字段中设置为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的。libelibd

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

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

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

设置of也可以修复 tsc 错误"skipLibCheck": true,但我不确定这会产生什么负面影响。tsconfig.jsonlibe

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

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

标签: node.jstypescriptimport

解决方案


是不是因为我已将libd包的所有导出捆绑在一个index.ts文件中 [...]?

是的。

TypeScript 编译器看到您正在使用该文件libd/dist/index.{js|d.ts}并开始评估其导出。这样做时,它发现它ClassA正在使用depc,并去评估depc, - 但它无处可寻(因为它没有安装)。这是一个确定的错误。

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

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

TypeScript 不会对所有文件进行全面检查,而是d.ts对您在应用程序源代码中特别引用的代码进行类型检查。

......这最终是你想要的,对吧?


推荐阅读