React组件属性提示需满足三条件:文件为typescriptreact/javascriptreact模式、项目含@types/react等类型定义、语言服务器完成索引;组件库须提供.d.ts声明,JSDoc注释需紧贴组件定义并保存生效。

React组件属性提示依赖 TypeScript + 语言服务器,不是单纯开个设置就能有
VSCode 默认对 .jsx 文件只做基础语法高亮,不解析 props 类型。真正能显示组件属性(如 NutButton 的 type、size)的悬浮提示,必须满足三个条件:文件被识别为 typescriptreact 或 javascriptreact 模式,项目有类型定义(@types/react 等),且语言服务器(如 TypeScript Server 或 Pylance 的 JS 支持)已加载并完成索引。
常见错误现象:悬停 <button size="large"></button> 只显示 “JSX element type ‘Button’ does not have any construct or call signatures”,或干脆没提示——这不是 hover 被关了,是类型信息根本没进来。
- 确认右下角状态栏显示的是
typescriptreact(TSX)或javascriptreact(JSX),不是javascript或plaintext - 检查项目是否安装了
@types/react和@types/react-dom(JS 项目也建议装,Prettier/ESLint 插件会用到) - 确保根目录有
tsconfig.json(TS)或jsconfig.json(JS),哪怕内容为空:{}—— 这是触发完整语义分析的开关 - 首次打开大型 React 项目时,等右下角 TypeScript 图标停止旋转再试,否则
Ctrl+K+I也会返回 “no definition found”
组件库需提供 .d.ts 类型声明,否则 VSCode 看不到 props
你用的组件库(比如 Ant Design、NutUI、Concis)如果没导出类型定义文件(index.d.ts 或打包进 package.json 的 "types" 字段),VSCode 就只能把组件当黑盒,悬浮时最多显示 “any” 或空框。
验证方法:在 node_modules 里找对应包的 dist 或 lib 目录,看有没有 .d.ts 文件;或者在代码中 Ctrl+Click 组件名,能否跳转到类型定义。
将 React 应用升级到最新版本,从类组件迁移到 Hooks,并采用并发特性。用于现代化改造 React 代码库、迁移到 React Hooks 或升级到最新
- 若组件库无类型,可手动补
declare module 'xxx'到src/react-app-env.d.ts(Create React App)或自建types/xxx.d.ts - 使用 Volar(Vue)或 Pylance(Python)这类扩展时,它们不处理 React JSX,别指望它们“顺带”补上 props 提示
- 第三方 UI 库如 MUI、Chakra 已自带完整
.d.ts,但小众或内部组件库常遗漏这点,需推动维护者补全
插件级支持:nutui-vscode-extension 这类专用插件才真能注入文档链接和属性列表
纯靠语言服务器只能显示类型签名,像 “点击打开 NutButton 官方文档”、“列出所有支持的 size 值” 这类增强提示,必须由组件库官方或社区开发专用 VSCode 插件实现。典型代表就是 nutui-vscode-extension,它通过 vscode.languages.registerHoverProvider 注册 typescriptreact 和 vue 的 hover 处理器,在匹配 <nut-xxx></nut-xxx> 标签时返回定制 Markdown 内容。
这类插件生效的前提是:package.json 中 activationEvents 包含 onLanguage:typescriptreact,且 contributes.languages 正确声明了支持的语言 ID;否则即使安装了,hover 也完全不触发。
- 不要试图用通用插件(如 Auto Rename Tag、Prettier)替代专用 hover 插件——它们不提供 props 文档
- 启用后,悬停位置必须精准落在组件名上(如
<button> 的 <code>B上),不能停在尖括号或空格处 - 插件返回的 MarkdownString 中若含链接,必须是绝对 URL(如
https://nutui.jd.com/docs/button),./docs/button.md无效
别忽略 JSDoc 和 defaultProps 的作用,它们直接影响提示内容质量
即使有类型定义,若组件本身没写 JSDoc 或 defaultProps,悬浮提示里就看不到参数说明、默认值、是否必填等实用信息。React 函数组件推荐用 JSDoc + TypeScript interface 双保险:
/**
* 按钮组件
* @param {Object} props
* @param {string} props.type - 按钮类型,可选值:'primary' | 'success' | 'warning'
* @param {boolean} [props.disabled=false] - 是否禁用
* @param {string} [props.size='normal'] - 尺寸,可选值:'small' | 'normal' | 'large'
*/
const Button = ({ type, disabled = false, size = 'normal' }) => { ... }-
defaultProps在函数组件中已被废弃,改用解构默认值(如上例),否则 Pylance 不识别 - JSDoc 必须紧贴组件定义,中间不能有空行;单行注释
//不会被解析 - 修改 JSDoc 后必须保存文件,VSCode 才会重新解析并更新 hover 内容——不保存=没变化
真正卡住 React 属性提示的,往往不是设置没开,而是类型定义缺失、语言模式错配、或组件库本身没暴露 .d.ts。hover 提示不会自动“猜”props,它只反射你明确写下的类型和注释。

















