Problems面板直接显示“Cannot find name 'xxx'”等红字错误,是语言服务器基于作用域和声明分析的精准报错,比全局搜索更准,因后者仅字符串匹配且含干扰项。

直接看 Problems 面板(Ctrl+Shift+M),红色条目里标着 Cannot find name 'xxx' 或 xxx is not defined 的,就是未定义变量。这不是搜索问题,是语言服务已明确报错的硬性事实。
Problems 面板为什么比全局搜索更准
未定义变量的错误由 TypeScript/JavaScript 语言服务器实时推导,它知道作用域、声明提升、模块导入关系——而 Ctrl+Shift+F 只做字符串匹配,会把注释、字符串字面量、拼写近似的变量全列出来,干扰判断。
- Problems 面板只显示当前工作区中被语言服务实际分析过的文件(需有
tsconfig.json或jsconfig.json,且文件已打开或被构建流程扫描) - 双击面板里的任一条目,直接跳转到出错行,光标停在未定义符号上
- 悬停在波浪线下方,能看到完整错误信息,比如
Cannot find name 'useState',说明缺@types/react或没 import
F12 跳转失败 ≠ 变量未定义
F12 按了没反应,不等于这个变量不存在;它只是语言服务没建模出定义位置。常见假阴性场景:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 变量在
eval()或new Function()里声明,LSP 主动放弃分析 - JS 文件没启用
// @ts-check,或jsconfig.json缺"allowJs": true - Vue Options API 中的
data() { return { foo: 1 } },旧版 Vetur 不识别this.foo的反向引用 - 定义在未被工作区包含的目录下(比如
../shared/utils.js,但工作区只打开了子项目)
确认是否真未定义:三步交叉验证
别只信 Problems 面板红字,有些“未定义”是路径或拼写导致的,得人工核对:
- 光标停在报错变量上,按
Ctrl+Click(Windows/Linux)或Cmd+Click(macOS)——如果跳转到node_modules里的类型声明,说明它其实是定义了,只是 import 缺失或路径错 - 用
Ctrl+Shift+F全局搜const xxx =、let xxx =、var xxx =,注意关闭Match Whole Word,否则漏掉const myVarName = - 检查 import 语句:搜
from '.\/或import.*xxx(正则模式),确认有没有漏掉import { xxx } from './utils'
最容易被误判的是动态挂载到 window 或 globalThis 的变量、Webpack DefinePlugin 注入的常量、以及测试文件里手动 mock 的顶层变量——它们没有 import/require,语言服务看不到,但删了就运行时崩。

















