ts项目悬停只显示any,主因是tsconfig.json未生效:检查文件后缀、tsconfig存在且未被排除、状态栏显示typescript版本、skiplibcheck设为false;js项目需jsconfig.json+checkjs+jsdoc;悬停卡顿多因泛型过深,可关autoimports或设nostrictgenericchecks;运行时形状须调试器查看。

TS 项目里悬停只显示 any,不是配置漏了就是 tsconfig.json 没生效
悬停类型信息不完整,最常见原因是 TypeScript 编译器没真正加载你的项目配置。VSCode 默认用内置 TS 版本,但若工作区没识别为 TS 项目,tsserver 就不会读 tsconfig.json。
确认以下几点:
- 当前文件后缀必须是
.ts或.tsx;纯.js文件即使有@type注释,也不会触发完整类型推导 - 工作区根目录存在
tsconfig.json,且没有被files/include排除掉当前文件 - 右下角状态栏显示的是类似
TypeScript 5.6.3 (Workspace),而不是JavaScript—— 点它可手动切换语言模式 - 检查
compilerOptions.skipLibCheck:设为true会导致node_modules里的类型变成any,悬停自然空泛;保持默认false才能穿透第三方声明文件
JS 文件想有类似 TS 的悬停?靠 jsconfig.json + checkJs + JSDoc
纯 JS 项目无法启用 TS 类型系统,但 VSCode 支持通过轻量方式模拟部分效果。关键不是“加 TS”,而是让 JS 语言服务开启类型检查能力。
操作步骤:
- 在项目根目录新建
jsconfig.json,内容至少包含:{"compilerOptions": {"checkJs": true, "allowJs": true, "maxNodeModuleJsDepth": 2}} -
checkJs: true是核心开关,它让 JS 文件也走类型检查流程,从而支持基于 JSDoc 的类型推导 - 变量上方写 JSDoc 注释,例如:
/** @type {import('axios').AxiosInstance} */\nconst api = createApi();悬停就能看到完整类型 - 注意:如果用了
/** @typedef */自定义类型,要确保该文件被jsconfig.json的include覆盖,否则悬停看不到
悬停卡在 Loading…?大概率是泛型或条件类型太深
这不是 UI 假死,是 tsserver 真正在解析。尤其当代码含大量嵌套条件类型(如 infer + extends)、递归类型、或超长联合类型时,悬停响应会明显变慢。
缓解方法有限但有效:
- 在
tsconfig.json中加"noStrictGenericChecks": true(仅限开发期),可跳过部分严格泛型验证 - VSCode 设置里关掉
typescript.suggest.autoImports,减少后台补全压力,对悬停响应速度提升明显 - 避免在类型定义里写无限递归结构,例如
type Deep<t> = { a: Deep<t> }</t></t>—— 这会让tsserver在悬停时尝试展开到极限深度 - 大项目可考虑用
references拆成多个tsconfig.json,隔离类型计算范围
想看变量的运行时形状(比如数组长度、对象 key 数)?得靠调试器,不是悬停
悬停显示的是**编译时类型**,不是运行时值。想看到 arr.length === 12 或 tensor.shape = [3, 224, 224] 这类信息,必须进调试状态。
正确路径是:
- 打断点后,鼠标悬停确实能看简单值,但复杂结构建议直接用「变量」面板 —— 它自动展开层级,且支持右键「复制值」
- 对 tensor、buffer、map 等特殊对象,VSCode 默认不显示维度,需安装对应调试扩展(如
Python的ptvsd或nodejs的ndb)并启用 shape 插件支持 - 「监视」面板里手动输
myArray.length或Object.keys(myObj).length,比猜更可靠 - 别依赖悬停判断运行时行为 —— 类型是契约,值才是真相
调试时变量形状和维度信息不在悬停里,那是类型系统不管的事。真要看到 [3, 224, 224],得停在断点上,打开变量面板,或者手动加监视表达式。悬停永远只回答“它应该是什么”,不回答“它现在是多少”。











