TS7 的另一个重要变化是官方支持 LSP(Language Server Protocol)。
传统语言插件模式
在 LSP 之前,每个编辑器都要自己实现语言支持:
VS Code 需要 TypeScript 插件
WebStorm 需要 TypeScript 插件
Neovim 需要 TypeScript 插件
Sublime 需要 TypeScript 插件
...
每个编辑器团队都要:
- 理解 TypeScript 的类型系统
- 实现补全、跳转、诊断、重构
- 跟进 TypeScript 的版本更新
这是重复劳动,而且每个实现的质量和功能都不一样。
LSP 的设计
LSP 把"语言能力"和"编辑器"解耦:
┌─────────────────┐
│ Editor (Client) │
│ VS Code │
│ Neovim │
│ Zed │
└────────┬────────┘
│ LSP Protocol
↓
┌─────────────────┐
│ Language Server │
│ TypeScript │
│ Go │
│ Rust │
└─────────────────┘
Language Server 负责:
- 解析代码
- 类型检查
- 提供补全信息
- 提供诊断信息
- 提供跳转、重构能力
Editor 负责:
- 显示代码
- 发送用户操作给 Server
- 接收 Server 的响应并展示
两者通过标准化的 LSP Protocol 通信。
TypeScript 的语言能力层次
需要区分几个概念:
TypeScript 语言规范
↓
TypeScript Compiler(tsc)
↓
TypeScript Language Service
↓
LSP(Language Server Protocol)
↓
Editor(VS Code、Neovim...)
- TypeScript Compiler:把 TypeScript 编译成 JavaScript
- TypeScript Language Service:提供编辑器需要的语言能力(补全、诊断、跳转等)
- LSP:一种协议,让 Language Service 可以和任何编辑器通信
- Editor:实现 LSP Client,连接 Language Service
TypeScript Language Service 不等于 LSP。Language Service 是 TypeScript 自己的内部实现,LSP 是它暴露给编辑器的协议。
TS7 的 LSP 支持意味着什么
TS7 官方支持 LSP,意味着:
- TypeScript 团队维护 Language Server 的实现
- 编辑器只需要实现 LSP Client(标准化,工作量小)
- 速度优化、新功能,所有编辑器同步享受
- 不再需要为每个编辑器单独维护 TypeScript 插件
所以 TS7 发布后,VS Code、Neovim、Zed、Sublime、Emacs... 全部立刻受益。