You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:33:13