VS Code LSP中onCompletion()内document.getText()报错求助
解决LSP onCompletion中document可能undefined的问题
这是因为onCompletion回调里的文档获取逻辑和validateTextDocument不同,TypeScript的严格类型检查会提示潜在的undefined风险,按以下步骤修复:
1. 正确获取并校验文档实例
在onCompletion中,你需要通过params.textDocument.uri从LSP的文档缓存中获取对应文档,先判断文档是否存在再调用方法:
connection.onCompletion(async (params: CompletionParams) => { // 通过uri从文档缓存中获取目标文档 const document = connection.documents.get(params.textDocument.uri); // 先校验文档是否存在,避免undefined报错 if (!document) { return []; // 或返回undefined,根据业务需求处理 } // 现在可安全调用getText() const fullText = document.getText(); // 这里添加自定义函数、变量的解析逻辑 // ... // 返回生成的补全列表 return [ { label: "myCustomFunc", kind: CompletionItemKind.Function }, { label: "myVar", kind: CompletionItemKind.Variable } ]; });
2. 为什么validateTextDocument里无报错?
validateTextDocument通常在文档内容变更时触发,传入的参数是已确认存在的TextDocument实例,TypeScript类型系统认定它不会是undefined,因此不会触发提示。而onCompletion由补全请求触发,需通过uri去缓存中查找文档,存在缓存未命中的可能,所以类型检查会提示风险。
3. 谨慎使用的快捷方式
如果你能100%确认补全请求只会在文档已打开的情况下触发,可以用非空断言!跳过类型检查,但这种方式存在运行时报错风险,不推荐在不确定场景使用:
const document = connection.documents.get(params.textDocument.uri)!; const fullText = document.getText();
内容的提问来源于stack exchange,提问作者rnatong1
相关产品推荐
相关产品推荐

