我正在评估一个迁移到TypeScript的JavaEE环境中的大型代码库。有多个具有深度目录结构和JavaScript代码的项目,它们在项目中使用全局变量等。
TypeScript有多项目支持,这个小GitHub上的实例就说明了这一点。然而,我的案件更复杂。
(1) JS代码被放置在项目的深处,例如"Project1/src/main/resources/de/mycompany/webapp/ts".生成的JS代码应该放在"Project1/src/main/resources/de/mycompany/webapp/ts-generated".中。TypeScript为此提供了rootDir和outDir。
(2)文件夹结构很复杂,这就是为什么相对导入不是一种选择。例如,从核心项目引用文件应该总是相同的--无论是从ui项目还是从ui-utils项目。TypeScript为绝对引用提供了"baseUrl“和”路径“。然而,这似乎不适用于多项目设置(或者我做错了什么)。例如,我想要import * from '@core/utils/mycode.ts'。此引用应该相对于核心项目的baseUrl或rootDir进行解释。
(3)我必须引用全局范围内现有的JS代码。为此,TypeScript提供声明文件(.d.ts),可用于向编译器提供额外的类型信息。因此,我计划为现有的JS代码创建声明文件。然后,必须通过使用TypeScript项目来导入声明。但是,TypeScript中的import关键字似乎总是将声明作为带有命名空间的模块导入,这与JS对象绑定到全局范围这一事实相矛盾。我还找到了三重进口,它似乎适用于相对引用,但不适用于对其他项目的绝对引用。
问题
对于(2):是否有可能有绝对导入跨项目,最好是从baseUrl或rootDir?
对于(3):是否可以从全局范围内JS代码的其他项目导入(或引用) TypeScript声明。请注意,这不应该生成任何代码,它应该只告诉编译器现有的代码。
发布于 2020-03-13 16:03:08
关于(3)
为了包含全局范围类型声明(.d.ts文件),TypeScript在tsconfig.json:"typeRoots" : ["./typings"]中提供了"typeRoots“数组。请注意,这些文件也必须从“包含”数组("include": ["./typings/*.ts"])中的路径中获得。
这是因为"typeRoots“和"include”中的路径也可以指向当前项目之外的目录。
关于(2)
对TypeScript编译器的一次调用似乎不可能做到这一点。然而,在按依赖关系顺序逐个编译项目时,这是可能的。
因此,我假设已经编译了一个没有依赖项的项目P1。现在的目标是编译项目P2,它使用来自P1的代码。对于以下示例,假定P1的“P1”为“构建”:
"include": ["../P1/build/*.ts"]
"paths": { "@P1/*": ["../P1/build/*"] }
这是因为“路径”和“包含”数组中的路径可以指向当前项目之外的目录。
请注意,此解决方案没有使用TypeScript的TypeScript特性。请进一步注意,不需要typeRoots,除非您希望为普通JS代码提供类型信息。否则,类型信息应该已经在P1的“P1”中找到。
https://stackoverflow.com/questions/60560327
复制相似问题