开发VS Code扩展:提取TypeScript文件中固定名称变量的值
提取TypeScript文件中固定变量的OpenAPI规范(非AST方案)
方法1:正则表达式匹配(适合简单场景)
如果目标变量是顶级定义(比如const openApiSpec = { ... };),且变量内容没有复杂的TS语法(如嵌套注释、模板字符串),正则是最简便的方式。它能快速匹配变量的完整内容,再转成JSON对象使用。
代码示例:
const doc = vscode.window.activeTextEditor?.document; if (!doc) return; const fullText = doc.getText(); // 替换为你的目标变量名 const targetVarName = 'openApiSpec'; // 匹配变量定义,捕获赋值部分(支持多行) const regex = new RegExp(`const\\s+${targetVarName}\\s*=\\s*([\\s\\S]*?);`); const match = fullText.match(regex); if (match && match[1]) { try { // 处理TS对象字面量的单引号,转为JSON兼容格式 const cleanContent = match[1].replace(/'/g, '"').replace(/,\s*}/g, '}'); const openApiContent = JSON.parse(cleanContent); // 成功获取OpenAPI规范对象 console.log(openApiContent); } catch (e) { console.error("解析失败:变量内容格式不符合JSON规范", e); } }
注意:如果变量内容包含TS特有的语法(如类型断言、接口引用),正则可能匹配失效,建议用下面的方法。
方法2:TypeScript转译器提取(更可靠)
利用TypeScript的transpile API把TS代码转成JS,再在沙箱中执行获取变量值。这个方法能自动忽略类型注解等TS语法,比正则更稳定,又比完整AST解析轻量。
首先确保扩展依赖typescript包,然后使用以下代码:
import * as ts from 'typescript'; import * as vscode from 'vscode'; const doc = vscode.window.activeTextEditor?.document; if (!doc) return; const fullText = doc.getText(); const targetVarName = 'openApiSpec'; // 转译TS为JS,自动剔除类型相关代码 const jsCode = ts.transpile(fullText, { target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.CommonJS }); // 用沙箱执行代码,避免污染全局环境 const sandbox = { console }; try { // 通过Function构造器执行转译后的代码 const runCode = new Function('sandbox', `${jsCode}; return sandbox.${targetVarName};`); const openApiContent = runCode(sandbox); if (openApiContent) { console.log(openApiContent); } else { console.error("未找到目标变量"); } } catch (e) { console.error("执行转译代码失败", e); }
方法3:VS Code内置语言服务定位(精准匹配)
借助VS Code的TypeScript语言服务,可以精准定位目标变量的定义位置,避免匹配到注释或其他同名变量,适合变量可能出现在文件任意位置的场景。
代码示例:
import * as vscode from 'vscode'; const doc = vscode.window.activeTextEditor?.document; if (!doc) return; const targetVarName = 'openApiSpec'; // 获取当前文档的语言服务实例 const languageService = vscode.languages.getLanguageService({ getTextDocument: () => doc, getConfiguration: () => ({}) }); // 查找目标变量的定义(从文档起始位置发起查询) const definitions = await languageService.findDefinition( doc.uri, new vscode.Position(0, 0) ); if (!definitions) return; // 遍历定义结果,找到当前文档内的目标变量 for (const def of definitions) { if (def.uri.fsPath === doc.uri.fsPath) { const variableRange = def.range; const variableCode = doc.getText(variableRange); // 拿到变量的完整定义后,可结合方法2的转译方式解析值 console.log(variableCode); break; } }
内容的提问来源于stack exchange,提问作者florian norbert bepunkt
相关产品推荐
相关产品推荐

