以下是用於recursively walk a source file's abstract syntax tree (AST)的兩個Typescript函數。我已經設法識別導致我的程序只訪問部分樹的問題,但我不明白爲什麼解決方案有效。遞歸函數中的Typescript break與return行爲
walkTree1
函數是遍歷整個樹的有效解決方案。 walkTree2
函數只訪問樹的一部分。這兩個功能只有一行不同(標有註釋),顯然return
的行爲與此有關,但我沒有在網上找到任何有用的東西。
function walkTree1(firstNode: ts.SourceFile, visitor: (node: ts.Node) => void): void {
visitInterfacesRecursive(firstNode);
function visitInterfacesRecursive(node: ts.Node): void {
switch (node.kind) {
case ts.SyntaxKind.InterfaceDeclaration:
visitor(node); break; // correct
default:
ts.forEachChild(node, visitInterfacesRecursive);
}
}
}
function walkTree2(firstNode: ts.SourceFile, visitor: (node: ts.Node) => void): void {
visitInterfacesRecursive(firstNode);
function visitInterfacesRecursive(node: ts.Node): void {
switch (node.kind) {
case ts.SyntaxKind.InterfaceDeclaration:
return visitor(node); // offending change
default:
ts.forEachChild(node, visitInterfacesRecursive);
}
}
}
終於,我被難住了。我覺得我在這裏錯過了一些明顯的東西。我已經檢查了生成的源代碼,並且在那裏似乎沒有任何意外(除了類型擦除之外沒有真正的區別)。現在我發佈原始代碼;如果有必要的話,我會在稍後回家的時候將更加可重複的東西放在一起。
其他細節:
node -v
:V8.5.0tsc -v
:2.3.4版ts.forEachChild
source
請使用Stack Snippets('[<>]'工具欄按鈕)使用** runnable ** [mcve]更新您的問題。 (這需要刪除類型註釋,但這僅僅是所有內容。) –