为什么 npm 的导出字段在 typescript 中不起作用?

Jas*_*els 18 node.js npm typescript

我们的库@ltonetwork/lto是用打字稿编写的。我们用来tsc编译为lib文件夹中的javascript。

该包包含多个子包,这些子包位于包含index.ts 文件的子文件夹中。

当尝试导入子模块时,像这样

import {Transfer} from "@ltonetwork/lto/transactions";
Run Code Online (Sandbox Code Playgroud)

我希望这能起作用,但出现以下错误

test.ts:1:24 - error TS2307: Cannot find module '@ltonetwork/lto/transactions' or its corresponding type declarations.
Run Code Online (Sandbox Code Playgroud)

@ltonetwork/lto 的 package.json 包含

test.ts:1:24 - error TS2307: Cannot find module '@ltonetwork/lto/transactions' or its corresponding type declarations.
Run Code Online (Sandbox Code Playgroud)

tsconfig.json 是

{
  "scripts": {
    "compile": "tsc -p ./tsconfig.json"
  },
  "main": "lib",
  "exports": {
    ".": "./lib/index.js",
    "./*": "./lib/*/index.js",
    "./package.json": "./package.json"
  },
  "files": [
    "lib",
    "interfaces.d.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试显式命名子模块,而不是在 中使用通配符exports,但这没有什么区别。

我做错了什么导致这个导入问题?


编辑: 这与 monorepos 或纱线工作区无关。这是关于在 typescript 4.7.1-rc 中使用exportsnpm 中的字段。此功能不适用于早期版本的打字稿。

有关更多信息,请参阅https://github.com/microsoft/TypeScript/issues/33079

我也尝试过

{
  "compilerOptions": {
    "alwaysStrict": true,
    "baseUrl": "",
    "lib": ["es2017.object", "es2015", "es6", "dom"],
    "module": "commonjs",
    "sourceMap": true,
    "declaration": true,
    "target": "es6",
    "paths": {},
    "rootDir": "src",
    "outDir": "lib"
  },
  "include": ["src"]
}
Run Code Online (Sandbox Code Playgroud)

Reb*_*ens 32

确保moduleResolution在使用库中设置为Node16NodeNext在您的tsconfig.json文件中。

编辑:bundler现在也是一个选项。

  • 添加 moduleResolution 对我来说没有改变任何事情。我正在运行基本相同的设置。 (3认同)