Lerna、yarn 和 Typescript:找不到模块或其对应的类型声明

Posted

技术标签:

【中文标题】Lerna、yarn 和 Typescript:找不到模块或其对应的类型声明【英文标题】:Lerna, yarn, and Typescript: Cannot find module or its corresponding type declarations 【发布时间】:2021-05-10 20:26:20 【问题描述】:

我有一个 lerna + yarn 工作区 monorepo,具有独立的版本控制。我在导入同级包时遇到问题。

我有两个包,一个应该依赖另一个,如下图:

(root)
  |--packages
       |--money
       |--money-standard-units
            |--deps. on money

money-standard-deps 内部,我尝试导入money 的导出成员,但我无法这样做;我收到以下消息:

TS2307:找不到模块“money”或其对应的类型声明。

我知道可以通过将money 添加到money-standard-libs 的tsconfig 的paths 数组来解决此问题,但我想依赖 built 包,因为它们将被发布分开。我希望它能够像两个单独的存储库一样有效地工作。

我创建了一个demo repo。

【问题讨论】:

由于这很常见,需要更多的说明......也许是一个小的 github repo? 我认为@gaitat 可能就是这种情况。我把一个小例子放在一起,并添加了问题的链接。 我无法真正编译,因为没有 @somescope 但可能在 money/src/index.ts 中将 export * from './monetary-unit'; 更改为 export MonetaryUnit from './monetary-unit'; @gaitat 你能具体说明“没有@somescope”是什么意思吗?如果您的意思是此范围未在 npmjs.com 上注册,那么这正是重点;这些包应该链接到本地​​。 我只是说这个"dependencies": "@somescope/money": "^0.0.0" 不会解决。 【参考方案1】:

如果要将 typescript 项目用作另一个 typescript 项目的依赖项,则需要配置 typescript 项目以生成类型声明 *.d.ts 文件。为此,您需要将 tsconfig 的 compilerOptions.declaration 属性设置为 true。您可以在 tsconfig-common.json 文件中执行此操作。

例如(tsconfig-common.json):


  ...
  "declaration": true
  ...

此外,与在 package.json 文件中指定 main 属性以标识包的入口文件的方式相同,您还需要指定 types 属性以指定类型声明文件所在的位置.您需要对 monorepo 中的每个包都执行此操作。

例如(package.json):


  "name": "@somescope/money",
  ...
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  ...

另外,我注意到您在 monetary-unit 模块中进行了默认导出,但随后在 uses-money 模块中对其进行了命名导入。

如果您打算使用命名导入来引用它,则需要更改 monetary-unit 模块以在类上使用命名导出。

示例(货币单位.ts):

// Remove the default keyword
export class MonetaryUnit 
  constructor(
    readonly value: number,
    readonly name: string,
  ) 

【讨论】:

感谢您回答@JoshA。这绝对解决了问题,现在可以正确导入包。感谢您的帮助! 很高兴我能帮上忙。如果您认为我能够回答您的问题,如果您可以将其标记为已回答,那就太好了。 :-) 绝对!我忙了几天,想用一个复杂的例子来检查一下这在实践中是否有效。一切正常,我已将您标记为答案(任何给予赏金)。再次感谢。

以上是关于Lerna、yarn 和 Typescript:找不到模块或其对应的类型声明的主要内容,如果未能解决你的问题,请参考以下文章

基于 Yarn WorkSpace + Lerna + OrangeCI 搭建 Typescript Monorepo 项目实践

将 Lerna 与 Yarn 工作区一起使用有啥优势吗?

Yarn + Lerna + Angular Libs = 出版失败?

使用 yarn 工作区和 lerna 优先构建顺序

javascript 使用lerna,monorepo和yarn工作空间创建一个babel变换器来修复babel-jest问题

Yarn workspace + lerna 在每个子包中创建 node_modules