我有一个内部包,它的结构如下:
myPackage/
|- types/
| |- type1.d.ts
| |- type2.d.ts
|- src/
| |- someUtilities.ts
|- index.ts
|- package.json
|- tsconfig.json
index.ts
正在导入和导出./types
中所有的.d.ts
文件和./src
中所有的.ts
文件。我用tsc
编译它,并将所有声明文件复制到构建中,得到这个结构。
myPackage/
|- types/
| |- type1.d.ts
| |- type2.d.ts
|- src/
| |- someUtilities.ts
|- index.d.ts
|- index.js
|- package.json
index. d.s正确地拥有所有类型的导入和导出,如预期的,index.js有我在src中拥有的任何翻译版本。到目前为止一切顺利。
我有另一个(CRA)项目,我想使用这个内部包。我打包了myPackage
,然后在另一个项目中放入了package。json与
dependencies: {
"myPackage": "file:pathToMyPackage.tgz"
}
在开发过程中,VSCode从包中正确地找到所有类型和函数。然而,当我运行npm run build
时,它只是运行react-scripts build
,我得到一个错误Module not found: Can't resolve './types/type1.d.ts' in '/node_modules/myPackage
。
如果我在types目录下创建了一个索引文件,并将其作为我在package中的类型。Json,构建过程将找到这些类型,但显然无法从SRC文件中找到编译后的类型。
myPackage/
|- types/
| |- type1.d.ts
| |- type2.d.ts
| |- index.d.ts <- this one importing those above and works in when using as dep in other projects
|- src/
| |- someUtilities.ts
|- index.d.ts <- this isn't found because package.json points to types/index.d.ts as types
|- index.js
|- package.json
然后我尝试在包根使用一个索引,并使用那些三重斜杠指令指向类型。这是可行的,但在其他项目中,我必须在导入它时使用特定类型的完整路径
// index.ts at package root
/// <reference path="./types/type1.d.ts">
/// <reference path="./types/type1.d.ts">
import { someUtility } from './src/someUtilities'
export { someUtility }
// Doesn't work
import { someType } from 'myPackage'
// Works
import { someType } from 'myPackage/path/to/the/type/file'
是否有可能将所有类型分离到它们单独的文件中并以某种方式捆绑它们,以便它们可以从索引中导入,或者我是否需要手动将它们捆绑到一个巨大的index.d.ts
文件中,然后从那里使用?我不希望这样做,因为索引声明文件会很大,很难管理。我在types目录下有多个声明文件,每个声明文件都有自己的命名空间。
我发现,为了在一个入口点拥有所有.ts
和.d.ts
文件,.d.ts
类型需要作为import { type someType } from './types/type1.d.ts'
导入
index.ts
文件可以是这样的:
export { utility } from './src/someUtilities'
export { type someType } from './types/type1'
现在,当编译完成后,所有导入和导出都正确地保存在根目录下生成的index.d.ts
文件中。当然,您在编译过程之外创建的.d.ts
文件需要复制到types文件夹中。