VS Code中JSDoc泛型基类的模板继承约束与非空父项配置
文件系统抽象基类JSDoc注解问题解决方案
问题1:约束泛型TParent必须派生自Base类
可以通过JSDoc的@template语法结合extends关键字,明确指定泛型类型的继承边界,这样代码提示就能识别parent的属性与方法。
示例代码:
/** * 文件系统抽象基类 * @template TParent extends Base<any, any> * @template TChild */ class Base { /** * @param {TParent | null} parent */ constructor(parent) { /** @type {TParent | null} */ this.parent = parent; } // 调用父项方法时,编辑器可识别父类的属性/方法 callParentMethod() { this.parent?.someParentMethod(); } } /** * 文件夹类,继承自Base * @template TParent extends Base<any, any> * @template TChild extends Base<any, any> */ class Folder extends Base { /** @type {TChild[]} */ children = []; someParentMethod() { console.log("父项方法执行"); } }
通过@template TParent extends Base<any, any>,强制TParent必须是Base的派生类,编辑器会自动解析parent的成员。
问题2:非根节点Foo类避免parent空检查
在Base允许parent为null的前提下,可通过重写parent的类型声明或泛型约束强制非空两种方式,让类型检查工具识别Foo的parent永远非空,无需空检查或// @ts-ignore。
方法一:重写parent属性类型
/** * 永远存在父项的Folder派生类 * @extends {Folder<Folder<any, any>, Base<any, any>>} */ class Foo extends Folder { /** * @param {Folder<any, any>} parent */ constructor(parent) { super(parent); // 此处parent类型已被声明为非null,可直接调用方法 this.parent.someParentMethod(); } /** @type {Folder<any, any>} */ parent; // 重写parent类型,移除null可能性 }
方法二:泛型约束TParent不为null
/** * 永远存在父项的Folder派生类 * @template TParent extends Folder<any, any> * @extends {Folder<TParent, Base<any, any>>} */ class Foo extends Folder { /** * @param {TParent} parent */ constructor(parent) { super(parent); // 泛型约束确保TParent非null,类型检查直接通过 this.parent.someParentMethod(); } }
内容的提问来源于stack exchange,提问作者cabbageforall
相关产品推荐
相关产品推荐

