Typescript 和子路径导入

use*_*046 10 node.js typescript

我正在尝试让 Node 子路径导入和打字稿正常工作。我的 IDE 在解析导入时没有问题,但 Typescript 从来不高兴。

包含代码的 Github 存储库:https://github.com/doronrosenberg/ts-subpath-imports

包.json:

  "imports": {
    "#internal/*": "./internal/*.ts",
    "#internal2": "./internal"
  }
Run Code Online (Sandbox Code Playgroud)

tsconfig.json:

  "paths": {
    "#internal/*": "./internal/*.ts",
    "#internal2": ["./internal"]
  }
Run Code Online (Sandbox Code Playgroud)

和代码:

import { foo } from "#internal/index";
import { bar } from "#internal2";
Run Code Online (Sandbox Code Playgroud)

无论我如何设置,我总是得到:

src/test.ts:1:21 - error TS2307: Cannot find module '#internal/index' or its corresponding type declarations.

1 import { foo } from "#internal/index";
                      ~~~~~~~~~~~~~~~~~

src/test.ts:2:21 - error TS2307: Cannot find module '#internal2' or its corresponding type declarations.

2 import { bar } from "#internal2";
                      ~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 12

在使用 Typescript 几周后,我得到了一个可行的解决方案。

假设我有一个名为@kodadot1/metasquid多个子模块(consolidatorentity)的包。

在我的package.json声明中imports

  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs"
    },
    "./consolidator": {
      "types": "./dist/consolidator.d.ts",
      "import": "./dist/consolidator.mjs",
      "require": "./dist/consolidator.cjs"
    },
    "./entity": {
      "types": "./dist/entity.d.ts",
      "import": "./dist/entity.mjs",
      "require": "./dist/entity.cjs"
    }
}
Run Code Online (Sandbox Code Playgroud)

诀窍是.d.ts为项目根目录中的每个子模块创建一个文件。

因此,对于子模块,entity我将创建一个名为的文件entity.d.ts,其中包含

export * from './dist/entity'
Run Code Online (Sandbox Code Playgroud)

现在要在npmjs中正确发布它,请扩展您的package.json喜欢:

export * from './dist/entity'
Run Code Online (Sandbox Code Playgroud)

现在只需发布,您就可以享受子路径导入:

import { get } from '@kodadot1/metasquid/entity'
Run Code Online (Sandbox Code Playgroud)

完整代码可以在这里找到


uni*_*nal 6

子路径导出的支持需要更新的模块分辨率,例如Node16NodeNext

{
  "compilerOptions": {
    "moduleResolution": "Node16" // or `"NodeNext"`
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个对我来说很有效。需要注意的是,模块解析必须在导入包的项目中设置,而不是在包本身中设置。 (2认同)