typescript 如何导出类型定义并通过本地包的npm链接使用它们?

lymnna71  于 2023-10-22  发布在  TypeScript
关注(0)|答案(1)|浏览(192)

bounty还有5天到期。回答此问题可获得+200声望奖励。Daniel Ramos希望引起更多的注意这个问题。

我正在创建一个名为tepper的超级测试替代方案。我正在尝试将软件包发布为ESM和CJS。我遇到的问题是库的使用者无法找到类型定义。
为了测试它,我创建了一个脚本(你可以找到它here),它生成一个全新的NestJS项目,并尝试使用相对路径(npm install --save-dev ../../../..)在本地安装它来使用库。
问题是我有一个TS2307: Cannot find module 'tepper' or its corresponding type declarations错误(here你可以在Github Actions上看到这个错误)。
我已经导出了package.json中的类型,正如我所想的那样:

{
  "exports": {
    ".": {
      "types": "./dist/types/tepper.d.ts",
      "require": "./dist/cjs/tepper.js",
      "import": "./dist/esm/tepper.js",
      "default": "./dist/esm/tepper.js"
    }
  }
}

谢谢你,谢谢

62o28rlo

62o28rlo1#

您的脚本似乎正在执行以下操作:
1.导航到test/e2e/nestjs目录。
1.删除project-name目录和clean.js文件(如果存在)。
1.全局安装NestJS CLI。
1.创建一个名为project-name的NestJS项目。
1.创建一个clean.js文件,该文件读取新项目中的app.e2e-spec.ts文件,用tepper库替换supertest的示例,并记录结果。
1.使用Node.js运行clean.js并将其输出重定向到新文件app.new.e2e-spec.ts
1.将原始app.e2e-spec.ts替换为新文件。
1.导航到新项目目录。
1.将库作为开发依赖项安装。
1.运行端到端测试。
看起来你在package.json中导出类型方面做得很对。然而,您仍然遇到TS2307的原因可能有几个:找不到模块“tepper”或其相应的类型声明错误。

TypeScript配置:请确保您的tslog.json文件已正确设置。宣言:true选项应启用以生成相应的.d.ts文件1.
模块分辨率:TypeScript解析模块的方式由tslog.json中的moduleResolution选项控制,该选项可以是node或classic。如果省略此设置,则编译器将此设置视为node(如果模块是commonjs),否则将其视为classic 2。
IDE问题:有时,IDE可能不会立即获取更改,您可能需要在IDE 1中重新启动TypeScript服务器。
发布为ESM和CJS:当将包发布为ESM和CJS时,您可以使用esbuild等工具来生成.js和.mjs文件3。此外,确保package.json正确指向两个版本45。
嵌套导入:如果你使用的是嵌套导入,请确保在package.json的exports字段中正确指出它们。

我希望它有帮助:)

相关问题