将 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'" 错误。因此,我尝试了以下方法:
- 添加
baseUrl: .
和 paths: { a: [ ../a/index.d.ts ] }
,现在因 "Module build failed: Error: /path/to/packages/a/index.d.ts is missing from the TypeScript compilation." 而失败
- 做
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."
- 在
packages/b/tsconfig.json
中添加../../a/index.d.ts
到include
完成2. 后,结果仍然相同。我认为这是因为 rootDir
之外的文件无法在 includes
. 中引用
- 将
rootDir: src
替换为packages/b/tsconfig.json
中的rootDirs: [ src, ../a ]
。相同的结果。
有没有人知道如何解决或完全避免这些编译错误?我想到的唯一策略是在包 a
中创建一个 .js 条目,它实现 index.d.ts
的接口并将它们导出为模块,而 index.d.ts
声明该模块的定义.但我更愿意只保留共享的接口,而不是可能因包而异的实现细节。
能否避免将 .d.ts
文件放在 package.json
的 main
字段中,而是将其放在 types
中?
package.json
对于 a
:
{
"name": "a",
"version": "1.0.0",
"main": "index.js",
"types": "index.d.ts"
}
index.js
在 a
:
module.exports = {}
在构建过程中,TypeScript 应该从 types
字段中拉取接口。您不需要在 tsconfig.json
.
中对 rootDir
、include
、baseUrl
等做任何特殊的事情
我有以下目录布局,利用 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'" 错误。因此,我尝试了以下方法:
- 添加
baseUrl: .
和paths: { a: [ ../a/index.d.ts ] }
,现在因 "Module build failed: Error: /path/to/packages/a/index.d.ts is missing from the TypeScript compilation." 而失败
- 做
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." - 在
packages/b/tsconfig.json
中添加../../a/index.d.ts
到include
完成2. 后,结果仍然相同。我认为这是因为rootDir
之外的文件无法在includes
. 中引用
- 将
rootDir: src
替换为packages/b/tsconfig.json
中的rootDirs: [ src, ../a ]
。相同的结果。
有没有人知道如何解决或完全避免这些编译错误?我想到的唯一策略是在包 a
中创建一个 .js 条目,它实现 index.d.ts
的接口并将它们导出为模块,而 index.d.ts
声明该模块的定义.但我更愿意只保留共享的接口,而不是可能因包而异的实现细节。
能否避免将 .d.ts
文件放在 package.json
的 main
字段中,而是将其放在 types
中?
package.json
对于 a
:
{
"name": "a",
"version": "1.0.0",
"main": "index.js",
"types": "index.d.ts"
}
index.js
在 a
:
module.exports = {}
在构建过程中,TypeScript 应该从 types
字段中拉取接口。您不需要在 tsconfig.json
.
rootDir
、include
、baseUrl
等做任何特殊的事情