跳转到正文
ieuforuruntime notes
↩ WRITING

TypeScript / 02 MIN

LSP 是什么:编辑器和语言的桥梁

Language Server Protocol 如何把语言能力和编辑器解耦——为什么 TS7 支持 LSP 后,所有编辑器都能享受速度提升

2 MIN READ

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... 全部立刻受益。


同系列文章 10
  1. TypeScript 7:Go 重写与实现的分离
  2. LSP 是什么:编辑器和语言的桥梁
  3. 为什么 React 的 TypeScript 体验如此自然
  4. 为什么 Vue/Angular 生态需要额外的工具链
  5. TypeScript 的本质:编译时约束
  6. 类型系统的核心:结构化类型
  7. 泛型:让逻辑与类型解耦
  8. 条件类型与 Discriminated Unions
  9. Type-driven React:类型驱动的组件设计
  10. TypeScript + React:从 Type 到 Reality