JSDoc如何让子类重写方法的参数类型继承基类方法的对应类型?
解决方案
- 方案1:使用
@override注解(推荐,适配绝大多数支持JSDoc类型校验的环境,比如VS Code内置类型校验、开启checkJs的TypeScript项目)
仅需在子类重写的方法上方添加/** @override */注释即可,类型工具会自动继承父类对应方法的参数、返回值类型,无需重复编写参数类型声明:
class BaseFooBar { /** @param {number} bar */ foo(bar) { console.log('bar is' + bar); } } class FooBar extends BaseFooBar { /** @override */ foo(bar) { // 此时bar会被自动识别为number类型 console.log('bar is' + bar); } }
该方案额外的优势是:如果重写方法的参数、返回值类型和父类不匹配,类型工具会直接抛出错误提示,避免继承时的类型不一致问题。
- 方案2:抽离公共方法类型复用
如果你的校验环境不支持@override注解,可以提前把方法的类型定义抽成公共的@typedef,父类子类都引用该类型即可,也不需要重复写参数注释:
/** @typedef {(bar: number) => void} FooMethod */ class BaseFooBar { /** @type {FooMethod} */ foo(bar) { console.log('bar is' + bar); } } class FooBar extends BaseFooBar { /** @type {FooMethod} */ foo(bar) { // bar会被识别为number类型 console.log('bar is' + bar); } }
后续要调整foo方法的类型时,仅修改FooMethod的定义即可,不用逐个修改父类子类的注释。
内容的提问来源于stack exchange,提问作者Ed.an
相关产品推荐
相关产品推荐

