将 TypeScript 声明从本地私有模块导入应用程序

Importing TypeScript declarations from local, private module into application

我有以下目录布局,利用 yarn workspaces:

package.json
tsconfig.json
packages/
  a/
    package.json   // contains "name": "a" & "version": "1.0.0"
    index.d.ts
  b/
    package.json
    tsconfig.json
    src/
      index.ts

内部 packages/b/tsconfig.json 一些非常基本的规则:

{
  extends: 
  compilerOptions: {
    rootDir: src,
    outDir: build
  },
  include: [ **/*.ts ]
}

我想要完成的是将 packages/a/index.d.ts 中声明的定义导入到 packages/b/src/index.ts 中,并使用 import { Foo } from 'a'; 之类的语句。我想将 index.d.ts 保留在它自己的包中,因为我还有一个使用相同定义的包 c

如果不进行任何修改,上述内容将引发 "Module not found: Error: Can't resolve 'a'" 错误。因此,我尝试了以下方法:

  1. 添加 baseUrl: .paths: { a: [ ../a/index.d.ts ] },现在因 "Module build failed: Error: /path/to/packages/a/index.d.ts is missing from the TypeScript compilation."
  2. 而失败
  3. yarn workspace b add a@1.0.0,符号链接 node_modules/a -> packages/a。有趣的是,这也导致了"Module not found: Error: Can't resolve 'a'",直到我将main: index.d.ts添加到packages/a/package.json,之后我再次得到"Module build failed: Error: /path/to/packages/a/index.d.ts is missing from the TypeScript compilation."
  4. packages/b/tsconfig.json 中添加../../a/index.d.tsinclude 完成2. 后,结果仍然相同。我认为这是因为 rootDir 之外的文件无法在 includes.
  5. 中引用
  6. rootDir: src替换为packages/b/tsconfig.json中的rootDirs: [ src, ../a ]。相同的结果。

有没有人知道如何解决或完全避免这些编译错误?我想到的唯一策略是在包 a 中创建一个 .js 条目,它实现 index.d.ts 的接口并将它们导出为模块,而 index.d.ts 声明该模块的定义.但我更愿意只保留共享的接口,而不是可能因包而异的实现细节。

能否避免将 .d.ts 文件放在 package.jsonmain 字段中,而是将其放在 types 中?

package.json 对于 a:

{
  "name": "a",
  "version": "1.0.0",
  "main": "index.js",
  "types": "index.d.ts"
}

index.jsa:

module.exports = {}

在构建过程中,TypeScript 应该从 types 字段中拉取接口。您不需要在 tsconfig.json.

中对 rootDirincludebaseUrl 等做任何特殊的事情