VSCode悬停显示重载签名取决于语言服务器是否返回多组签名,而非编辑器设置;需按规范编写声明签名、启用对应类型检查并保存文件触发更新。

VSCode 本身不提供函数重载悬停的自定义能力,能否显示多个签名,完全取决于语言服务器是否返回了重载数据——不是设置能改出来的,而是代码写法和扩展配置共同决定的。
为什么悬停里只有一行签名,而不是重载列表
这不是 VSCode 没渲染,是语言服务器根本没发过来多组签名。常见断点:
-
tsconfig.json缺失或"skipLibCheck": true导致@types/*中已有的重载声明被跳过 - TypeScript 文件用了
declare function却只写了一个签名(实现签名不会进 hover) - JavaScript 文件写了
/** @overload */—— 这个标签不被 TypeScript Server 识别,JSDoc 无法表达重载 - Python 文件没用
@typing.overload装饰,或 Pylance 的类型检查被禁用
TypeScript 中让重载真正出现在悬停里的写法
必须严格按“声明签名 + 实现签名”顺序写,且声明签名要独立、可导出:
function parse(str: string): number;
function parse(str: string, radix: number): number;
function parse(str: string, radix?: number): number {
return parseInt(str, radix ?? 10);
}关键细节:
- 每个声明签名上方都要有独立的
/** */注释,不能只注释在实现上 -
@param和@returns要按每个声明签名分别写,不能复用 - 实现签名必须带
export或出现在declare块中,否则不被索引 - 如果文件是
.js,即使加了// @ts-check和 JSDoc,也无法触发重载解析
Python 中启用重载悬停的硬性条件
Python 不像 TS 那样原生支持重载语法,必须靠 typing.overload + Pylance 类型检查协同生效:
- 确保安装的是
Pylance(不是基础 Python 扩展),且状态栏右下角显示Pylance已激活 -
settings.json中必须设"python.analysis.typeCheckingMode": "basic"或"strict" - 所有重载声明都得是
def函数体(不能pass),且都加@overload;实现函数单独写、不加装饰器 - 函数参数类型必须显式标注(如
x: int),仅靠 docstring 无法推导重载分支
别碰 editor.hover.enabled,该关的其实是 MDN 链接
很多人一看到悬停里弹出 MDN 页面就去关 editor.hover.enabled,结果连变量值预览和类型提示都没了。真正该关的是:
-
html.suggest.html5→ 设为false -
css.mdnsuggest→ 设为false
改完后执行 Developer: Reload Window(不是重启窗口)。这样 document.querySelector 悬停不再跳 MDN,但你写的重载签名和 @param 依然清晰可见。
最容易被忽略的一点:修改了重载声明或 JSDoc 后,必须保存文件,语言服务器才会重新分析并更新悬停内容——它不会实时响应未保存的编辑。


















