如何将许多 TypeScript 声明文件捆绑到一个 npm 包中并从 index.d.ts 导入?

zap*_*lec 5 npm typescript tsc .d.ts npm-package

我有一个内部包,其结构如下:

\n
myPackage/\n|- types/\n|  |- type1.d.ts\n|  |- type2.d.ts\n|- src/\n|  |- someUtilities.ts\n|- index.ts\n|- package.json\n|- tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

正在导入和导出中的index.ts所有文件以及中的所有文件。我将其转译并将所有声明文件复制到构建中并获取此结构。.d.ts./types.ts./srctsc

\n
myPackage/\n|- types/\n|  |- type1.d.ts\n|  |- type2.d.ts\n|- src/\n|  |- someUtilities.ts\n|- index.d.ts\n|- index.js\n|- package.json\n
Run Code Online (Sandbox Code Playgroud)\n

index.d.ts 正确地具有预期的所有类型导入和导出,并且 index.js 具有我在 src 中拥有的任何内容的转译版本。到目前为止一切都很好。

\n

我有另一个(CRA)项目,我想在其中使用这个内部包。我打包myPackage然后在另一个项目中放入 package.json 中

\n
dependencies: {\n  "myPackage": "file:pathToMyPackage.tgz"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在开发过程中,VSCode 从包中正确找到所有类型和函数。但是npm run build,当我运行时(只是运行)react-scripts build,我收到错误Module not found: Can\'t resolve \'./types/type1.d.ts\' in \'/node_modules/myPackage

\n

如果我在 types 目录下创建一个索引文件,并将其作为 package.json 中的类型,构建过程将找到这些类型,但显然无法从 src 文件中找到转译的类型。

\n
myPackage/\n|- types/\n|  |- type1.d.ts\n|  |- type2.d.ts\n|  |- index.d.ts <- this one importing those above and works in when using as dep in other projects\n|- src/\n|  |- someUtilities.ts\n|- index.d.ts <- this isn\'t found because package.json points to types/index.d.ts as types\n|- index.js\n|- package.json\n
Run Code Online (Sandbox Code Playgroud)\n

然后,我尝试在包根目录使用一个索引,并使用这些三斜杠指令来指向类型。这种方法可行,但在其他项目中,我在导入时必须使用某种类型的完整路径

\n
myPackage/\n|- types/\n|  |- type1.d.ts\n|  |- type2.d.ts\n|- src/\n|  |- someUtilities.ts\n|- index.ts\n|- package.json\n|- tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n
// Doesn\'t work\nimport { someType } from \'myPackage\'\n\n// Works\nimport { someType } from \'myPackage/path/to/the/type/file\'\n
Run Code Online (Sandbox Code Playgroud)\n

是否可以将所有类型分离到单独的文件中并以某种方式捆绑它们,以便可以从索引导入它们,或者我是否需要手动将它们捆绑到一个大index.d.ts文件中并从那里使用?我不想这样做,因为索引声明文件会很大并且难以管理。我在 types 目录下有多个声明文件,每个声明文件都有自己的命名空间。

\n

zap*_*lec 1

我发现为了将所有.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'
Run Code Online (Sandbox Code Playgroud)

现在,当它被转译时,所有导入和导出都正确地存在于index.d.ts根目录中生成的文件中。当然,.d.ts您在转译过程之外创建的文件需要复制到 types 文件夹中。