第一章 - TypeScript 编译器 API 是什么

214 阅读4分钟

这是TypeScript Compiler API系列的第一篇文章

轻松了解 TypeScript 编译器 API 的全部功能

TypeScript 编译器应用程序接口(TS Compiler API)主要提供两大功能:通过编程方式读取 TypeScript 代码,以及通过编程方式生成 TypeScript 代码。这个 API 既可用于一次性任务的独立脚本,也能集成到服务端应用中处理更复杂的动态场景。

工作原理

该 API 的核心功能就是编程式读写 TS 代码,具体如何实现呢?

对于代码读取:

  1. 将文件或代码字符串传给 API
  2. API 会解析分析代码
  3. 返回抽象语法树(AST)

第二章会详细讲解 AST,现在你可以把它想象成类似 HTML 的树状数据结构。不过 AST 存储的不是 DOM 节点,而是用于重构代码的语法节点。

获得程序或文件的 AST 后,我们就能获取丰富的代码信息。通过"遍历"AST(第四章详述),可以精确分析代码内容。比如解析这段代码:

const hello: string = "world"

API 会告诉我们:

  • 这是个常量变量声明
  • 标识符为"hello"
  • 显式声明了 string 类型
  • 初始化值为字符串字面量"world"
  • 同时也会反馈不易察觉的细节:
    • 没有使用感叹号标记
    • 变量语句没有修饰符

后续章节会详解变量声明与变量语句的区别。

对于代码生成,过程正好相反:

  1. 我们向编译器提供 AST
  2. 编译器根据 AST 生成对应代码

要生成上面的示例代码,我们需要:

  • 声明一个常量变量语句
  • 指定标识符为"hello"
  • 设置返回类型为 string
  • 提供初始值"world"
  • 同时必须明确声明不需要的内容(如本例不要修饰符和感叹号)

第七章将详细介绍编程生成 TS 代码。

错误检测

除了读写代码,TS Compiler API 还能提供强大的错误检测功能。

代码检查工具(Linter)的工作原理:

  1. 根据预设规则分析代码
  2. 发现不符合规则时显示错误/警告
    • 例如忘记声明显式类型
    • 或类型被隐式推断为 any
    • 或函数返回类型与声明不符

这些工具通过分析 AST 并应用规则逻辑来实现检测。当发现违规时,会显示包含错误位置详情的诊断信息。某些规则还支持自动修复,比如自动修正函数返回类型使其与代码实际返回一致。这种自动修复也是通过动态修改 AST 节点实现的。第六章我们将动手编写简易 TS 检查器。

相比 Linter,TS Compiler API 更侧重基础语法错误检测,比如:

  • 使用了错误的符号(该用(却用了{) 这类错误会尽早暴露,因为它们会导致运行时问题。而 Linter 发现的某些问题可能不会影响运行时行为。

从 JS 文件生成声明

该 API 还能解析带有 JSDoc 注释的普通 JS 文件,例如:

/**
 * hello 函数接收字符串
 * 并添加"hello "前缀
 * @param {string} value 要添加的字符串
 * @returns {string} 返回格式化后的字符串
 */
function hello(value) {
  return `hello ${value}`
}

通过解析 JSDoc 注释,API 可以生成真正的 *.d.ts 声明文件。这类文件仅包含类型定义,没有运行时逻辑。除了自动生成,开发者也可以手动编写声明文件。

增量程序监视器 & 语言服务 API

增量程序监视器是另一个实用工具:

  • 监视文件/目录变化
  • 仅分析变更部分(增量处理)
  • 缓存信息提升处理速度

适用场景包括:

  • 自定义诊断
  • 实时代码更新
  • 增量文档生成等

更高级的场景可以使用语言服务 API,通过语言服务器与宿主通信来实现高效的代码修改。第九章将详细介绍。

自定义模块解析

该 API 还支持自定义模块解析策略。当编译器无法自动解析模块时,开发者可以编写逻辑来手动定位文件位置。

总结

TypeScript Compiler API 是提升开发效率的利器,它能:

  • 自动化繁琐任务
  • 提供深度定制能力
  • 优化 TypeScript 开发体验

本书后续章节将通过丰富示例详细讲解每个功能。