根本原因是 TypeScript 类型定义未加载,React 本身无类型声明,需手动安装 @types/react 和 @types/react-dom,并在 tsconfig.json 或 jsconfig.json 中配置 "jsx" 和 "typeAcquisition"。

为什么 React 组件里写 useState 没提示?
根本原因不是 VSCode 缺插件,而是 TypeScript 类型定义没加载进来。React 本身不带类型声明,create-react-app 或 vite 项目默认装了 @types/react 和 @types/react-dom,但纯 JS 项目或手动搭建的环境往往漏掉这两个包。
实操建议:
- 检查
node_modules/@types/react是否存在;不存在就运行npm install --save-dev @types/react @types/react-dom - 确保
tsconfig.json(或jsconfig.json)中启用了类型自动获取:"typeAcquisition": { "enable": true } - JS 项目必须有
jsconfig.json,哪怕只写{}—— 否则 VSCode 不启用 JS 语言服务的完整补全
JSX 标签不识别、报红 Cannot use JSX unless the '--jsx' flag is provided
这是 TypeScript 编译器层面的配置缺失,VSCode 的 IntelliSense 依赖它来理解 JSX 语法。光装类型包不够,还得告诉 TS “允许 JSX”。
实操建议:
- 在
tsconfig.json中确认包含:"jsx": "react-jsx"(TS 4.1+ 推荐)或"jsx": "preserve"(旧版) - 如果是
jsconfig.json,加"compilerOptions": { "jsx": "preserve" }即可,不需要装 TS - 改完配置后,右键打开命令面板(
Ctrl+Shift+P),执行Developer: Restart Language Server,别只刷新窗口
自定义 Hook 的参数和返回值没提示
VSCode 能补全 useState 是因为 @types/react 里写了完整泛型定义,但你写的 useFetch 或 useToggle 如果没显式标注类型,TS 就推导不准,补全就弱甚至消失。
实操建议:
- 给自定义 Hook 显式写返回类型,比如:
function useToggle(): [boolean, () => void] { ... } - 参数用接口或类型别名约束,避免
any:function useApi<t>(url: string): { data: T | null; loading: boolean }</t> - 如果 Hook 内部用了泛型,必须让调用处能传递类型参数,否则推导会 fallback 到
any
组件属性(props)补全失效或显示 any
常见于函数组件没写类型注解,或者用了 const Component = (props) => {...} 这种写法。TS 无法从无类型的参数推导出 props 结构,VSCode 自然没法提示 className 或自定义 prop。
实操建议:
- 用箭头函数时,必须标注参数类型:
const Button = ({ children, variant }: { children: React.ReactNode; variant?: 'primary' | 'secondary' }) => ... - 更推荐用接口 + 解构:
interface ButtonProps { children: React.ReactNode; variant?: 'primary' | 'secondary'; },然后const Button = ({ children, variant }: ButtonProps) => ... - 避免直接写
props.className,解构出来才能触发精准补全
补全质量高度依赖类型精度,不是装个插件就能一劳永逸的事。漏一个 @types/react,或少写一个接口,都可能让整个组件树的提示退化成猜词模式。


















