VSCode中JavaScript IntelliSense提示异常,如何获取精准成员建议?
VSCode IntelliSense 提示异常的原因及修复方案
问题现象
在VSCode中编写如下JavaScript类代码:
export default class User{ static USER_DIALOG_STATUS = { LEARN: 1, AUTHORIZE: 2, WAIT_LEARN: 3, }; static USER_AUTH_STATUS = { GUEST: 1, AUTHORIZED: 2, PREAUTHORIZED: 3, }; dialog_statuses(p_status){ switch(p_status) case this.USER_DIALOG_STATUS. } }
输入到case this.USER_DIALOG_STATUS.时,IntelliSense弹出的提示包含大量无关内容:
AUTHORIZE AUTHORIZED GUEST PREAUTHORIZED USER_AUTH_STATUS USER_DIALOG_STATUS User WAIT_LEARN WORDS_LEARN
实际期望只显示USER_DIALOG_STATUS对象下的三个属性:
AUTHORIZE LEARN WAIT_LEARN
原因分析
USER_DIALOG_STATUS是类的静态属性,属于User类本身而非类的实例。在实例方法dialog_statuses中用this访问静态属性时,VSCode的JavaScript语言服务无法准确推断this.USER_DIALOG_STATUS的具体类型,只能 fallback 展示当前作用域内所有可见的标识符,包括其他静态属性、类名甚至外部变量,因此出现了无关提示。
修复方案
方案1:直接用类名访问静态属性
将this.USER_DIALOG_STATUS替换为User.USER_DIALOG_STATUS,语言服务能明确识别到该静态对象的类型,仅弹出其内部的三个属性提示:
case User.USER_DIALOG_STATUS.
方案2:用JSDoc标注类型(保留this写法的场景)
如果需要继续使用this,可以通过JSDoc给this标注类型,明确静态属性的结构:
/** * @param {number} p_status * @this {typeof User} */ dialog_statuses(p_status){ switch(p_status) case this.USER_DIALOG_STATUS. }
或者直接给静态属性添加类型标注:
/** @type {{LEARN: number, AUTHORIZE: number, WAIT_LEARN: number}} */ static USER_DIALOG_STATUS = { LEARN: 1, AUTHORIZE: 2, WAIT_LEARN: 3, };
内容的提问来源于stack exchange,提问作者Dmitry Kovalevsky
相关产品推荐
相关产品推荐

