如何为JS代码片段中的隐式全局变量vscode指定类型
如何为JS脚本上下文已存在的全局
vscode变量声明正确类型 我有一个会被VSCode扩展通过eval()执行的JavaScript文件,脚本运行时上下文已经预置了全局变量vscode(即VSCode API),运行本身没有问题。我希望通过JSDoc注解或者TypeScript类型定义文件,让VSCode的类型检查器识别这个已存在的全局vscode变量。
我试过如下写法,但没有生效:
// @ts-check /// <reference path="node_modules/@types/vscode/index.d.ts" />
如果我加一行const vscode = require('vscode')确实可以让类型生效,但我不想加这行代码,因为vscode在运行上下文里已经存在了。
后续尝试均失败
我尝试创建了types.d.ts类型定义文件:
export {} declare global { var vscode: any }
然后在JS文件中添加引用:
/// <reference path="types.d.ts" />
这种写法可以让类型检查器识别到全局vscode对象的存在,但我不希望vscode的类型是any,想要它匹配真实的VSCode API类型。我只找到了vscode的模块定义:
declare module 'vscode' { // 类型定义内容 }
我尝试直接导入模块来引用类型:
export {} import vscode from 'vscode' declare global { var vscode: vscode }
但导入时报错:"Module 'vscode' has no default export.";如果改用命名导入又会报错:"Module 'vscode' has no exported member 'vscode'"。
解决方案
可以通过typeof直接获取模块的整体类型,最终的types.d.ts写法如下:
export {} declare global { var vscode: typeof import('vscode') }
如果不需要额外定义其他类型,也可以直接在JS文件中通过JSDoc注解实现,我因为本身需要types.d.ts定义其他类型,所以这个方案完全满足需求。
内容的提问来源于stack exchange,提问作者ᴇʟᴇvᴀтᴇ
相关产品推荐
相关产品推荐

