类型服务器协议(TSP)概述
什么是类型服务器协议?
类型服务器协议(TSP)是一种专门的 JSON-RPC 协议,旨在促进类型服务器与客户端(如 IDE)之间的通信。与语言服务器协议(LSP)主要面向人类可读的编辑器功能(如悬停文本和诊断)不同,TSP 提供结构化的、机器可读的类型分析数据。这使得工具能够以编程方式消费类型信息(如计算类型、声明类型和预期类型),而无需依赖对 Markdown 字符串的脆弱解析。
TSP 存在的原因
现有协议如 LSP 针对编辑器交互进行了优化,而非深度类型系统集成。LSP 的悬停信息通常以 Markdown 形式提供,这非常适合显示,但难以被自动化重构工具、linter 或 AI 代理可靠地解析。TSP 通过返回结构化的、带标签的类型对象来解决这一问题,这些对象表示实际的类型图,包括类、函数、联合类型和模块。通过标准化这些数据,微软旨在允许开发者在不同的类型检查器(如 Pylance 或 Pyrefly)之间切换,同时在不同 IDE 中保持一致的行为。
核心架构与特性
TSP 作为 LSP 的伴侣,通常运行在同一连接上。它引入了几个关键概念来管理性能和状态:
- 基于快照的分析: 快照是一个非负整数,表示工作区在某个时间点的视图。由于类型分析计算成本高昂,结果绑定到特定的快照。如果文件发生变化,服务器会推进快照,客户端必须请求更新的信息。
- 多连接模式: 为了防止高容量的类型查询阻塞主 LSP 连接,TSP 支持可选的辅助 IPC 通道。这允许并发的只读类型查询,而主连接处理可变的 workspace 状态和生命周期事件。
- 能力握手: 客户端和服务器在标准 LSP 初始化过程中协商对 TSP 功能的支持,确保向后兼容性,并在服务器不支持该协议时优雅降级。
协议表面
TSP 有意保持轻量,专注于提供对 Python 代码深入洞察的一小组查询:
typeServer/getComputedType:返回从代码流推断出的类型(例如,在类型收窄之后)。typeServer/getDeclaredType:返回源代码中显式定义的类型。typeServer/getExpectedType:返回周围上下文所需的类型。typeServer/resolveImport:提供模块导入的解析数据。
社区观点
TSP 的引入引发了关于 Python 工具生态系统碎片化的大量讨论。虽然一些开发者赞赏向结构化数据的转变,但其他人对微软主导的协议激增表示担忧。
“这个协议真正的价值在于从基于字符串的信息转向结构化数据。LSP 悬停信息是为人类设计的;如果工具想要使用类型信息,它不应该猜测格式。关键挑战在于平衡计算完整类型图的成本与低延迟 IDE 响应性的需求。” — Hacker News 用户 coindef
批评者指出,该协议目前高度特定于 Python 的类型系统,这引发了关于它是否会保持为一个小众工具还是演变为更广泛标准的问题。此外,一些替代 Python 工具(如 basedpyright)的维护者对单独协议的必要性表示怀疑,而像 Astral(Ruff 的创建者)这样的团队表示他们打算支持它以确保互操作性。
Sources
相关
- 项目
- 项目
- Dispatch
- 项目
- 项目