【问题标题】:Typescript library import with sub paths带有子路径的打字稿库导入
【发布时间】:2021-11-29 10:38:04
【问题描述】:

我有一个从 React 应用程序使用的 Typescript 库。我想导入带有子路径的 TS 库内容,例如

import {base} from "my-lib"
import {foo} from "my-lib/path1"
import {bar} from "my-lib/path2"

我遇到了Github issue,它指出 Typescript 尚不支持(exports in package.json)。我正在使用 Typescript 4.3。

在同一线程中发布了一种解决方法 - Github repo typescript-subpath-exports-workaround。它使用exportstypeVersions

{
  "main": "dist/index.js",
  "types": "dist-types/index.d.ts",
  "exports": {
    ".": "./dist/index.js",
    "./exported": "./dist/exported.js"
  },
  "typesVersions": {
    "*": {
      "exported": ["dist-types/exported"]
    }
  }
}

我创建了一个新的 react 应用程序(通过 npx create-react-app 命令)并尝试从 typescript-subpath-exports-workaround 导入 hello 并且效果很好。但无法导入 `typescript-subpath-exports-workaround/exported

import {hello} from "typescript-subpath-exports-workaround" //works fine
import {foo} from "typescript-subpath-exports-workaround/exported" //gives "Module not found" error

完整的错误如下:

./src/App.js
Module not found: Can't resolve 'typescript-subpath-exports-workaround/exported' in '/Users/...../my-react-app/src'

代码沙盒代码 - https://codesandbox.io/s/create-react-app-forked-5yxd8

更新:导入时使用的子路径和文件夹结构不同。在上面的示例中,不会有一个名为 path1path2 的文件夹。

【问题讨论】:

  • 什么!?打字稿不能这样做吗?真可惜。

标签: reactjs typescript


【解决方案1】:

正如How to create a local module in TypeScript 中的回答:

使用module-alias 包可能会解决您的问题。

将此配置添加到 package.json 中:

"_moduleAliases": {    "my-module":
"<your_build_folder>/modules/my-module" },

这段代码在第一行

您的主文件 (server.ts/index.ts)

import 'module-alias/register';

【讨论】:

    【解决方案2】:

    查看Next.JS React 框架。您可以看到他们使用与您描述的完全相同的方法。您可以使用他们的 CLI 工具创建一个简单的打字稿应用程序,如下所示:

    npx create-next-app@latest --typescript

    然后注意 ./pages/index.tsx 中使用的导入。

    然后,如果您查看./node_modules/next/package.json,您会发现它们以两种方式公开构建文件:实际代码和类型定义在./node_modules/next/dist/* 中,它们的重新导出就在./node_modules/next/* 中。

    至少这是一个真实的例子,也是开始实验的好地方。这并不意味着您必须学习他们的整个代码库。您只需要在 Typescript 库中模仿他们的 package.json 文件 (https://github.com/vercel/next.js/blob/canary/packages/next/package.json) 的基本部分,特别是 maintypesfiles

    更新

    看看可以从哪里导入缺失的导入:

    正如您可能理解的那样,这些是放置相应*.d.ts 文件的位置。因此,您只需在库的根文件夹中创建重新导出文件,并在库的package.json 的“文件”属性中提及它们。

    我为自己的图书馆拥有的完全相似的图片。

    我认为除了在 lib 的根文件夹中有重新导出或原始类型定义之外,没有其他方法可以按照您想要的方式导入您的库

    【讨论】:

    • 我相信只有当文件夹结构相同时导入才会起作用(比如next/dynamic)。在我的项目中,文件夹结构和导入路径会有所不同。
    • 好吧,您可以使用与重新导出类似的方法来将您的 lib 文件放在您想要的位置,同时,让应用程序按照您的方式导入它们想。查看我的答案的更新
    • 谢谢。看起来很有希望。我去看看
    猜你喜欢
    • 2022-11-05
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2016-06-17
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多