如何用JsDoc让父类静态方法返回子类静态变量类型并被IntelliSense识别?
解决父类静态方法返回子类静态变量类型的IntelliSense识别问题
在JavaScript中,要让VS Code的IntelliSense正确识别子类重写后的静态变量类型,需要用JSDoc泛型绑定父类与子类的类型关联,具体实现如下:
步骤1:给父类添加泛型模板
通过@template定义泛型参数指代子类的Settings类型,并用@type将父类静态Settings与泛型参数绑定:
/** * @template T - 子类静态Settings的类型 */ class Parent { /** @type {T} */ static Settings; /** * Gets settings * @param {string} userId * @returns {T} */ static get(userId) { // 实际获取逻辑 return this.Settings; } }
步骤2:子类继承时指定泛型参数
定义子类的Settings类型(也可直接写对象结构),通过@extends将泛型参数指定为子类的Settings类型,同时重写静态Settings:
// 定义子类的Settings类型(可选,也可直接在@type中写对象结构) /** @typedef {{ foo: string, bar: number }} ChildSettings */ /** * @extends {Parent<ChildSettings>} */ class Child extends Parent { /** @type {ChildSettings} */ static Settings = { foo: "demo", bar: 456 }; } // 测试:IntelliSense会正确识别返回类型为ChildSettings const childSettings = Child.get("user1"); childSettings.foo; // 自动提示属性 childSettings.bar; // 自动提示属性
方案优势
- 泛型模板让父类类型不再固定,支持多个拥有不同属性的子类;
@extends的泛型参数能让IntelliSense跟踪到子类的Settings类型,正确推断静态get方法的返回值;- 避免了给父类Settings加固定
@type导致的类型锁死问题。
内容的提问来源于stack exchange,提问作者Nihilum
相关产品推荐
相关产品推荐

