gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:27:45 24 4
gpt4 key购买 nike

我正在评估将 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) 文件夹结构复杂,因此不能选择相对导入。例如,从核心项目引用文件应该始终相同 - 无论是从 ui 项目还是 ui-utils 项目完成。 TypeScript 提供 "baseUrl" and "paths"绝对引用。但是,这似乎不适用于多项目设置(或者我做错了什么)。例如,我想 import * from '@core/utils/mycode.ts' .此引用应相对于核心项目的 baseUrl 或 rootDir 进行解释。

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

问题

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

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

最佳答案

关于(3)

为了包含全局范围类型声明(.d.ts 文件),TypeScript 在 tsconfig.json 中提供了“typeRoots”数组:"typeRoots" : ["./typings"] .请注意,这些文件也必须在“包含”数组 ("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”数组中的路径可以指向当前项目之外的目录。

    请注意,此解决方案不使用 Project References TypeScript 的特性。进一步注意,不需要 typeRoots,除非您想为纯 JS 代码提供类型信息。否则类型信息应该已经在 P1 的“outDir”中找到

    关于TypeScript 从其他项目绝对导入普通 TS 文件和全局范围声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60560327/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com