【问题标题】:TypeScript compiler API: find which file a type came fromTypeScript 编译器 API:查找类型来自哪个文件
【发布时间】:2019-11-01 01:32:12
【问题描述】:

给定ts.Program 和类型的名称,是否可以找到该类型来自哪个文件?被查询的类型会一直存在于程序中,并且会从主入口点导出。

这里我不一定需要特定的代码,只需要从哪些 API 开始或类似的示例。使用program.getTypeChecker() 获得ts.TypeChecker 可能是相关的,但它的任何方法似乎都没有提供一种明显的方法来从只是一个类型名称 到可以告诉哪里定义类型的东西。

(VS Code“去定义”在概念上是相似的,但代码贯穿了几个抽象层,并不是一个有用的例子。)

【问题讨论】:

    标签: typescript typescript-compiler-api


    【解决方案1】:

    从给定的类型你可以得到符号,你可以从符号得到声明。从符号的声明中,您可以获得该类型的所有源文件(例如,声明合并可能导致一个类型有多个声明,而这些声明可能存在于另一个文件中)。

    这是一些示例代码(未经测试,但我认为它会起作用):

    const symbol = type.getSymbol()!; // todo: you should handle for when undefined
    const declarations = type.declarations;
    const sourceFiles = Array.from(new HashSet(declarations.map(d => d.getSourceFile()));
    

    【讨论】:

    • 问题是我没有类型。我只有一个类型的名称。
    • 哦,我错过了。该类型名称是什么样的,以便您可以知道该名称的来源?它看起来像import("some/path/to-file.ts").SomeDeclaration,其中路径相对于模块的根目录?还是全局类型的名称(例如Array)?
    • 该名称来自从my-package 导出的所有类型名称的列表(由另一个工具生成)。理论上你可以做import { Foo } from 'my-package'my-package 的索引文件,它引用的所有内容都在TS 程序中。如果没有更直接的 API,也许有一种方法可以生成类型名称的假根级导入并查看它解析为什么?
    • 哦,我明白了。是否可以自己获取包的导出?您可以在包的主源文件上执行const fileSymbol = typeChecker.getSymbolAtLocation(sourceFile);,然后检查fileSymbol 上的exports 属性。从这些导出符号中,您可以按照它们进行声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2013-03-03
    • 2012-09-30
    • 2020-09-08
    • 2018-11-04
    • 2017-09-08
    • 2020-06-16
    相关资源
    最近更新 更多