TypeScript 版本: 2.9.0-dev.20180426
在遍历源文件的 TypeScript 抽象语法树(AST)时,通过扩展 ts.*
从 typescript.d.ts
发现了许多有用的东西,我希望这些可以被暴露出来(或者不标记为 /* @internal */
)。
搜索词:
typescript.d.ts
Node.locals
Symbol.parent
getContainingFunction
isAssignmentTarget
代码
declare namespace ts {
interface Node {
/* @internal */ readonly locals?: SymbolTable; // Locals associated with node (initialized by binding)
}
interface Symbol {
/* @internal */ readonly parent?: Symbol; // Parent symbol
}
function getContainingFunction(node: Node): SignatureDeclaration | undefined;
function isAssignmentTarget(node: Node): boolean;
}
注意:
- 为
Node#locals
和Symbol#parent
添加了readonly
- 对于
Symbol#parent
,目标是:给定一个方法的符号(例如,对于methodSymbol
的方法),找到该方法的定义位置(例如,对于Number#toString
的方法)...也许应该使用Number
而不是program.getTypeChecker().getSymbolAtLocation(methodSymbol.valueDeclaration.parent)
? - 对于
ts.getContainingFunction()
,似乎更合适的返回类型应该是SignatureDeclaration | undefined
而不是SignatureDeclaration
相关问题:
7条答案
按热度按时间xqnpmsa81#
有一个包提供了声明,甚至包括内部内容:https://www.npmjs.com/package/byots
关于
isAssignmentTarget
:你可能想要使用我库中的isReassignmentTarget
。0pizxfdo2#
我不认为我们想暴露
symbol.parent
和locals
。这些是我们可以更改的内部实现细节,无需提前通知。getContainingFunction
和isAssignmentTarget
没问题。我们会提交一个PR来公开它们。eni9jsuy3#
@mhegazy 所以,
symbol.parent
是我沿着右侧行动计划的第二个注意事项(获取符号的值声明、获取其父级、获取其符号)?我很快就需要深入了解为什么我需要node.locals
。ccgok5k54#
正确。
3zwtqj6y5#
有没有可靠的方法可以在不使用
node.locals
的情况下找到模块范围内可用的所有符号?这是我迫切希望做到的事情。gdrx4gfi6#
请查看
TypeChecker#getSymbolsInScope
(您可以从program
获取其示例)。gpnt7bae7#
我同意
symbol.parent
的观点!在符号树上操作非常困难,没有它就更难了。