TypeScript变形金刚-关注模块导入

时间:2020-05-10 21:18:22

标签: typescript typescript-compiler-api

我真的很想知道如何在自定义打字机转换器中跟踪模块导入。事实上,我希望实现以下目标:

  • 我想找到一个函数调用,例如transform(PlaygroundComponent)

  • 然后我想找到作为函数调用的参数检索的相应类(PlaygroundComponent)并进行调整/转换。此类可以从另一个文件导入。

我真的很想知道如何实现这一目标。目前,我不知道如何跟随模块导入并获得有关类定义的帮助。

我将不胜感激。谢谢。 :)


这是我的问题的更详细说明:

===设置===

文件:source.ts

import { ttransformer } from "../ttransformer";
import { TestComponent } from "./test.component";
ttransformer(TestComponent);

此文件是自定义打字机转换器的主要目标。

文件:ttransformer.ts

export function ttransformer(type: any): void {}

目前,这只是打字稿转换器的“标记”。

文件:test.component.ts

export class TestComponent {}

只是一个基本类,它将作为变换器函数的参数而基于。

===运行===

在文件 source.ts 上使用ts-patch运行自定义打字稿转换器将执行以下操作:

  • 文件 source.ts 是主要的入口点。因此它将解析此文件。但是,它将开始解析此文件的导入。
  • 首先它将解析文件 ttransformer.ts (第一个导入语句)。
  • 其次,它将解析文件 test.component.ts 。 (第二个导入语句)。
  • 然后它将继续处理文件 source.ts 的其余部分。

===问题===

因此,我遇到以下问题: 在我知道要调整它之前,遍历了我要调整的实际类。我只知道应该由于 ttransformer(PlaygroundComponent)来修改该类。这行代码是最后处理的内容。

所以我不知道应该在正确的时间转换哪个班级的信息。

===我的想法===

因此,我有两个解决方案:

  • 按照模块导入步骤查找特定的类,然后进行调整。因此,转换器会看到 ttransformer(PlaygroundComponent)行,然后必须遵循PlaygroundComponent的导入。因为它必须找到定义。

  • 或者使用两个变压器穿越AST两次。第一个转换器找到所有必须转换的类,第二个转换器进行实际的转换。那么您的建议就可以了,因为我确实知道必须调整哪些班级。


所以这个问题也与我的问题有关: Shared data with typescript transfromers

1 个答案:

答案 0 :(得分:1)

您可以使用TypeChecker#getAliasedSymbol

鉴于您共享的example code,您将使用typeChecker.getAliasedSymbol(argumentSymbol)来获取导入的基本符号。