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

如何通过Node API修改tsconfig.json并保留注释

如何在Node.js中修改tsconfig并保留注释

要修改tsconfig.json且保留原有注释,不能直接修改解析后的配置对象再用JSON序列化(会丢失注释),必须通过操作TypeScript的JSON AST来实现,步骤如下:

核心思路

读取tsconfig的原始文本,解析为带注释信息的AST,修改AST中对应节点的值,再将AST序列化为保留注释和格式的JSON字符串,最后写入文件。

代码实现

const fs = require('fs');
const ts = require('typescript');

// 1. 读取tsconfig原始文本
const tsconfigPath = './tsconfig.json';
const rawContent = fs.readFileSync(tsconfigPath, 'utf8');

// 2. 将文本解析为带注释的AST
const sourceFile = ts.createSourceFile(
  tsconfigPath,
  rawContent,
  ts.ScriptTarget.Latest,
  true // 启用父节点关联,方便遍历
);

// 3. 定义修改AST属性的工具函数
function updateJsonProperty(node, propPath, newValue) {
  if (node.kind !== ts.SyntaxKind.ObjectLiteralExpression) return false;

  for (const prop of node.properties) {
    if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
      if (prop.name.text === propPath[0]) {
        if (propPath.length === 1) {
          // 替换属性值为新的字符串字面量
          prop.initializer = ts.createStringLiteral(newValue);
          return true;
        } else if (ts.isObjectLiteralExpression(prop.initializer)) {
          // 递归处理嵌套对象
          return updateJsonProperty(prop.initializer, propPath.slice(1), newValue);
        }
      }
    }
  }
  return false;
}

// 4. 修改compilerOptions.target为next
updateJsonProperty(sourceFile.statements[0].expression, ['compilerOptions', 'target'], 'next');

// 5. 将修改后的AST序列化为带注释的字符串
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const updatedContent = printer.printNode(
  ts.EmitHint.Unspecified,
  sourceFile.statements[0],
  sourceFile
);

// 6. 写入文件
fs.writeFileSync(tsconfigPath, updatedContent);

关键说明

  • 必须通过TypeScript的AST API操作,而非JSON.parse/JSON.stringify,后者会丢失注释、换行和格式
  • createSourceFile会保留原始文件的注释和结构信息
  • createPrinter生成的输出会尽量匹配原始文件的格式,包括注释和换行
  • 工具函数可根据需要扩展,比如处理数组、数字类型的属性值

内容的提问来源于stack exchange,提问作者李行知

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:15:25