TypeScript 语言服务通过提供丰富的 API 来实现编辑器集成和代码智能功能。它位于 TypeScript 编译器核心与编辑器工具、IDE 或其他需要分析 TypeScript 代码的工具之间。本文档解释了语言服务的架构和功能。
有关 TypeScript 编译器本身的信息,请参阅 编译器核心。
语言服务通过利用 TypeScript 编译器的类型系统,提供诸如代码补全、错误检查、导航和重构等类似编辑器的功能。它旨在为编辑器中发生变化的代码提供高效、增量式和按需分析。
来源: src/services/services.ts1-400 src/compiler/types.ts1-200 src/services/utilities.ts1-100
语言服务有三个主要组件
来源: src/services/services.ts360-400 src/services/types.ts1-100
语言服务通过 LanguageService 接口公开用于编辑器功能的函数。它充当 TypeScript 编译器核心的门面。
来源: src/services/types.ts80-120 src/services/services.ts210-360
主机作为语言服务与环境(通常是编辑器或 IDE)之间的接口。它提供文件系统访问、编译器选项和文件更改通知。
来源: src/services/types.ts40-80 src/server/editorServices.ts60-100
文档注册表在多个程序之间维护共享 SourceFile 对象的缓存,以避免冗余解析并支持增量更新。
来源: src/services/services.ts40-80 src/services/types.ts120-160
语言服务广泛利用 TypeScript 编译器的功能,但会针对编辑器场景进行调整
来源: src/services/services.ts100-200 src/compiler/program.ts100-200
语言服务通过文档注册表和脚本快照来管理文档,以有效地处理编辑器中的文本更改
来源: src/services/services.ts40-80 src/server/editorServices.ts100-150
补全服务会分析代码上下文,为变量、函数、类型和其他符号提供智能建议。
来源: src/services/completions.ts1-100
导航功能可帮助开发者理解和浏览代码
| 功能 | 描述 | 主要功能 |
|---|---|---|
| 查找所有引用 | 定位符号的所有提及 | findReferences |
| 转到定义 | 跳转到符号定义的位置 | getDefinitionAtPosition |
| 转到类型定义 | 跳转到类型定义 | getTypeDefinitionAtPosition |
| 转到实现 | 查找抽象方法的实现 | getImplementationAtPosition |
| 导航栏 | 提供结构化的大纲视图 | getNavigationBarItems |
来源: src/services/services.ts500-600 src/services/findAllReferences.ts1-100
格式化系统根据格式化规则调整代码间距、缩进和其他样式方面
来源: src/services/formatting/formatting.ts1-50 src/services/formatting/smartIndenter.ts1-50
重构和代码修复提供自动化的代码转换
来源: src/services/services.ts700-800 src/services/codefixes/importFixes.ts1-50
语言服务通常通过 TypeScript Server (TSServer) 进行消费,TSServer 为编辑器提供了基于协议的接口。
来源: src/server/session.ts1-100 src/server/protocol.ts1-100 src/server/editorServices.ts1-60
TypeScript 服务器将文件组织成项目,这些项目决定了文件的分析方式
来源: src/server/project.ts1-100
语言服务采用多种技术来在编辑器环境中保持响应性
来源: src/services/services.ts80-100 src/server/editorServices.ts150-200
消耗语言服务的关键入口点是
来源: src/services/services.ts350-400
TypeScript 语言服务是一个强大的组件,它将 TypeScript 丰富的类型系统引入到编辑器和 IDE 中。通过了解其架构和功能,开发人员可以更好地利用其特性、扩展其功能或将其集成到新工具中。