TypeScript 从其他项目绝对导入普通 TS 文件和全局范围声明

TypeScript absolute import from other project for normal TS files and global scope declarations

我正在为 JavaEE 环境中的大型代码库评估向 TypeScript 的迁移。有多个项目具有深层目录结构和 JavaScript 跨项目使用全局变量等的代码。

TypeScript 支持多项目,由这个小 example on GitHub 说明。但是,我的情况比较复杂。

(1) JS代码放在项目的深处,例如"Project1/src/main/resources/de/mycompany/webapp/ts"。生成的 JS 代码应该放在 "Project1/src/main/resources/de/mycompany/webapp/ts-generated" 中。为此,TypeScript 提供 rootDiroutDir

(2) 文件夹结构复杂,这就是为什么相对导入不是一个选项的原因。例如,引用来自 core 项目的文件应该始终相同 - 无论是来自 ui 项目还是 ui-utils 项目。 TypeScript 提供 "baseUrl" and "paths" 用于绝对引用。但是,这似乎不适用于多项目设置(或者我做错了什么)。比如我要import * from '@core/utils/mycode.ts'。此参考应相对于 core 项目的 baseUrlrootDir.

进行解释

(3) 我必须在全局范围内引用现有的 JS 代码。为此,TypeScript 提供了声明文件 (.d.ts),可用于向编译器提供额外的类型信息。因此,我计划为现有的 JS 代码创建声明文件。然后必须通过使用 TypeScript 项目来导入声明。然而,TypeScript 中的 import-keyword 似乎总是将声明导入为带有命名空间的 module ,这与 JS 对象绑定到全局范围的事实相矛盾。我还发现 Triple-Slash import,它似乎适用于相对引用,但不适用于对其他项目的绝对引用。

问题

对于(2):是否可以跨项目进行绝对导入,最好从 baseUrl 或 rootDir 导入?

For (3): 是否可以在全局范围内为 JS 代码从其他项目导入(或引用)TypeScript 声明。请注意,这不应生成任何代码,它应该只是告诉编译器有关现有代码的信息。

关于 (3)

为了包含全局范围类型声明(.d.ts 文件),TypeScript 在 tsconfig.json 中提供 "typeRoots" 数组:"typeRoots" : ["./typings"].请注意,这些文件也必须可从 "include" 数组 ("include": ["./typings/*.ts"]) 中的路径获得。

这是可行的,因为 "typeRoots" 和 "include" 中的路径也可以指向当前项目之外的目录。

关于 (2)

单次调用 TypeScript 编译器似乎无法做到这一点。但是,按依赖顺序依次编译项目时是可以的。

因此,我假设已经编译了一个没有依赖项的项目P1。现在的目标是编译项目 P2,它使用来自 P1 的代码。对于以下示例,假设 P1 的 "outDir" 为 "build":

  • 通过 P2 的 "includes" 数组包含 P1 "outDir" 中的所有 ts 文件。
    • "include": ["../P1/build/*.ts"]
    • 这将使 P1 中已编译的 d.ts 文件在 P2 中可用,这样 TypeScript 编译器就会知道 P1 中的代码。
  • 通过P2的"paths"数组为P1的"outDir"添加路径别名。
    • "paths": { "@P1/*": ["../P1/build/*"] }
    • 这将使绝对导入工作。

这是可行的,因为 "paths" 和 "includes" 数组中的路径可以指向当前项目之外的目录。

请注意,此解决方案未使用 TypeScript 的 Project References 功能。进一步注意,不需要 typeRoots,除非你想为纯 JS 代码提供类型信息。否则类型信息应该已经在 P1

的 "outDir" 中找到