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

Lerna、Thread和Typescript:找不到模块或其相应的类型声明,typescript,yarnpkg,lerna,yarn-workspaces,Typescript,Yarnpkg,Lerna,Yarn Workspaces,我有一个lerna+纱线工作区monorepo,具有独立的版本控制。在其同级中导入包时遇到问题 我有两个软件包,其中一个应该依赖于另一个,如下所示: (root) |--packages |--money |--money-standard-units |--{deps. on money} 在money standard deps内部,我尝试导入一个导出的money成员,但我无法这样做;我得到以下信息: TS2307:找不到模块“mon

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

我有两个软件包,其中一个应该依赖于另一个,如下所示:

(root)
  |--packages
       |--money
       |--money-standard-units
            |--{deps. on money}
在money standard deps内部,我尝试导入一个导出的money成员,但我无法这样做;我得到以下信息:

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

我知道这个问题可以通过向money-standard-libs的tsconfig的path数组中添加money来解决,但我希望依赖于构建的包,因为这些包将单独发布。我希望它能像两个独立的回购协议一样有效运作


我已经创建了一个。

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

例如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.ts:

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

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

例如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.ts:

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

由于这是很常见的,需要更多的澄清。。。也许是一个小型的github回购?我想可能是这样的@gaitat。我把一个小例子放在一起,并添加了问题的链接。我无法真正编译,因为没有@somescope,但可能会将export*从“/monetary unit”更改为“;从“/货币单位”输出{MonetaryUnit};货币/src/index。ts@gaitat你能具体说明没有@somescope是什么意思吗?如果你的意思是这个范围没有在npmjs.com上注册,那么这正是重点;这些软件包应该链接到本地。我只是说这些依赖项:{@somescope/money:^0.0.0}将无法解析。因为这很常见,需要进一步澄清。。。也许是一个小型的github回购?我想可能是这样的@gaitat。我把一个小例子放在一起,并添加了问题的链接。我无法真正编译,因为没有@somescope,但可能会将export*从“/monetary unit”更改为“;从“/货币单位”输出{MonetaryUnit};货币/src/index。ts@gaitat你能具体说明没有@somescope是什么意思吗?如果你的意思是这个范围没有在npmjs.com上注册,那么这正是重点;这些包应该链接到本地。我只是说这些依赖项:{@somescope/money:^0.0.0}将无法解析。感谢您回答@JoshA。这绝对解决了问题,现在可以正确导入包。谢谢你的帮助!很高兴我能帮忙。如果你认为我能回答你的问题,如果你能把它标记为已回答,那就太好了-绝对地我忙了几天,想用一个复杂的例子来验证这一点在实践中是否有效。一切都很好,我已经把你标记为任何赏金的答案。再次感谢。感谢您回答@JoshA。这绝对解决了问题,现在可以正确导入包。谢谢你的帮助!很高兴我能帮忙。如果你认为我能回答你的问题,如果你能把它标记为已回答,那就太好了-绝对地我忙了几天,想用一个复杂的例子来验证这一点在实践中是否有效。一切都很好,我已经把你标记为任何赏金的答案。再次感谢。