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 项目实践
Yarn + Lerna + Angular Libs = 出版失败?
javascript 使用lerna,monorepo和yarn工作空间创建一个babel变换器来修复babel-jest问题