【问题标题】:How to check if symbol is global via Typescript compiler API?如何通过 Typescript 编译器 API 检查符号是否是全局的?
【发布时间】:2018-05-29 11:25:52
【问题描述】:

指的是 TS 类型检查器中的符号,而不是 ES6 符号

给定 TypeScript AST 中的标识符节点,我可以使用 typeChecker.getSymbolAtLocation(identNode)。如何检查该符号是否在全局范围内而不是在外部模块中声明?

我正在编写一个语言服务插件,每次某些函数引用外部声明的值时都必须显示警告。它们可以引用本地声明的变量和全局变量,但不能来自外部模块。

我不确定是否需要使用getDeclarations()。我觉得这种信息可能会在ts.SymbolFlags 中编码,但我无法弄清楚所有的标志。例如,Transient 标志是什么意思?

【问题讨论】:

标签: typescript typescript-compiler-api


【解决方案1】:

全局符号将具有 undefined .parent

符号是否是瞬态的,是您不必担心的实现细节

【讨论】:

  • 感谢您的回答!我看到了与编译器不同的东西。在declare global {} 中声明的符号似乎有一个父级,但我可以检查parent.escapedName === 'global' 是否。接口Symbols 没有parent 属性;即使它被标记为内部使用它是否安全?最后,函数内的const foo 创建一个没有父符号的符号。为了与全局变量区分开来,我应该检查getDeclarations()[0] 并查看它是否在函数体内?
  • 我的意思是 escapedName === global 有两个下划线; StackOverflow 改变了格式
  • 这根本不正确......局部变量符号也有未定义的.parent。此外,.parent 是符号的内部属性,所以不要指望它。
猜你喜欢
  • 2017-03-23
  • 2012-03-24
  • 1970-01-01
  • 2020-05-25
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 2011-03-18
相关资源
最近更新 更多