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

时间:2018-06-01 16:16:35

标签: typescript tsconfig

我有以下目录布局,利用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.tsimport { Foo } from 'a';中声明的定义。我想将index.d.ts保留在自己的包中,因为我还有一个使用相同定义的包c

如果没有任何修改,上面会抛出一个"未找到的模块:错误:无法解决''"'错误。因此,我尝试了以下方法:

  1. 添加baseUrl: .paths: { a: [ ../a/index.d.ts ] },现在失败了"模块构建失败:错误:TypeScript编译中缺少/path/to/packages/a/index.d.ts "
  2. 执行yarn workspace b add a@1.0.0,符号链接node_modules/a -> packages/a。有趣的是,这也导致找不到"模块:错误:无法解决'''",直到我将main: index.d.ts添加到packages/a/package.json之后我再次得到"模块构建失败:错误:TypeScript编译中缺少/path/to/packages/a/index.d.ts。"
  3. 在执行2之后,在../../a/index.d.ts中将include添加到packages/b/tsconfig.json,结果仍然相同。我认为这是因为rootDir以外的文件无法在includes中引用。
  4. rootDir: src替换为rootDirs: [ src, ../a ]中的packages/b/tsconfig.json。结果相同。
  5. 有没有人知道如何解决这些编译错误或完全避免它们?我想到的唯一策略是在包a中创建一个.js条目,该条目实现index.d.ts的接口并将它们作为模块导出,而index.d.ts声明该模块的定义。但是我宁愿只保留共享的接口,而不是可能因包而不同的实现细节。

1 个答案:

答案 0 :(得分:0)

您是否可以避免将.d.ts文件放在main的{​​{1}}字段中,而是将其放入package.json

types package.json

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

index.js

a

在构建期间,TypeScript应从module.exports = {} 字段拉出以获取接口。您不应该对types中的rootDirincludebaseUrl等做任何特别的事情。