📜  ts-morph (1)

📅  最后修改于: 2023-12-03 14:48:02.717000             🧑  作者: Mango

TS-Morph

TS-Morph 是一款用于 TypeScript 代码转换和分析的 JavaScript 库。它提供了一套简单易用的 API,使得操作 TypeScript AST 变得更加容易。TS-Morph 可用于编写自定义编译器、代码修复工具、自动化重构工具等等。

特点
  • 支持完整的 TypeScript AST
  • 提供简单易用的 API
  • 支持源代码修改
  • 支持自定义插件
  • 支持常见的代码变换操作,包括格式化、重构、修改等
安装

您可以在项目中使用以下命令安装 TS-Morph:

npm install ts-morph

您也可以在浏览器中使用以下命令使用 TS-Morph:

<script src="https://unpkg.com/ts-morph"></script>
使用

TS-Morph 的使用非常简单,我们可以通过以下几个步骤来操作 TypeScript AST:

创建 Project

首先,我们需要创建一个 Project 对象:

import { Project } from 'ts-morph';

const project = new Project();
加载文件

然后,我们可以通过 project.addSourceFileAtPath() 方法来加载我们的 TypeScript 文件:

const sourceFile = project.addSourceFileAtPath('file.ts');
操作 AST

现在,我们可以对 sourceFile 对象进行各种 AST 操作了。例如,我们可以获取特定节点的属性或者修改节点:

const classDeclaration = sourceFile.getClassOrThrow('MyClass');
const property = classDeclaration.addProperty({
    name: 'myProperty',
    type: 'string'
});
property.setInitializer('""');
保存文件

最后,我们可以通过 project.saveSync() 方法来保存我们的修改:

project.saveSync();

完整示例:

import { Project } from 'ts-morph';

const project = new Project();
const sourceFile = project.addSourceFileAtPath('file.ts');
const classDeclaration = sourceFile.getClassOrThrow('MyClass');
const property = classDeclaration.addProperty({
    name: 'myProperty',
    type: 'string'
});
property.setInitializer('""');

project.saveSync();
自定义插件

TS-Morph 还支持自定义插件。插件可以在 TS-Morph 操作 AST 时进行预处理或者后处理操作。例如,我们可以编写一个插件,在保存文件之前对文件进行自动格式化。

插件示例:

import { Transformer, TransformerFactory } from 'ts-morph';

export function formatCode(): TransformerFactory<SourceFile> {
  return (context) => {
    const transformer: Transformer<SourceFile> = (sourceFile) => {
      sourceFile.formatText({
        ensureNewLineAtEndOfFile: true,
        indentSize: 2,
        indentStyle: IndentStyle.Spaces,
        insertSpaceAfterCommaDelimiter: true
      });
      return sourceFile;
    };
    return transformer;
  };
}

使用插件:

import { Project } from 'ts-morph';
import { formatCode } from './plugins/format';

const project = new Project();
const sourceFile = project.addSourceFileAtPath('file.ts');

// register the plugin
project.addSourceFileAtPath('file.ts', {
  transformers: {
    before: [formatCode()]
  }
});

project.saveSync();
总结

TS-Morph 是一款强大的 TypeScript AST 分析和转换库。其提供的简单易用的 API 和自定义插件使得在 TypeScript 编译器中进行代码分析和修改变得更加容易。如果您正在开发一个编译器、代码修复工具或者自动化重构工具,不妨试试 TS-Morph。