网站搜索

javascript - 如何导出类型定义并通过本地包的 npm link 使用它们?


我正在创建一个名为 tepper 的 supertest 替代品。我正在尝试将该包同时发布为 ESM 和 CJS。我遇到的问题是,库的使用者无法找到类型定义。

为了测试它,我创建了一个脚本(你可以在这里找到它),该脚本会生成一个全新的 NestJS 项目,并尝试通过使用相对路径本地安装库(npm install --save-dev ../../../..)来使用它

问题是我遇到了一个 TS2307: Cannot find module 'tepper' or its corresponding type declarations 错误(你可以在 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"
    }
  }
}

谢谢!

答案#1

关键点是 tsconfig 中的 resolvePackageJsonExports。请参考 https://www.typescriptlang.org/tsconfig#resolvePackageJsonExports。

在你的项目中,它未启用,因为 moduleResolution 和 module 的值。所以你有两个选项,

    1. 在文件 test/e2e/nestjs/project-name/tsconfig.json 中,设置以下内容。
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "resolvePackageJsonExports": true,
    1. 在 tepper 的主 packages.json 中使用经典的 types 字段,这可以避免由于 moduleResolution 和 module 的更改而影响其他内容。
"types": "./dist/types/tepper.d.ts",